- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在遍历整数数组 ${startTimes}
(音频文件中的标记位置,样本中)并使用 bc
将这些整数转换为毫秒.我将结果传递到新数组 ${msValuesArray}
。如果我一次运行每个数组元素,它就可以正常工作。如果我在 for
循环中运行它:
for i in $(seq 0 ${#startTimes[@]}); do
msValuesArray+=($(bc <<< ${startTimes[i]}/44.1))
done
生成的 ${msValuesArray}
包含预期结果,但终端输出 (standard_in) 1: parse error
。
虽然我打算在 shell 脚本中使用它,并且在阅读了此处的其他问题后我了解到将 #!/bin/bash
添加到命令的开头可以避免解析错误,但我仍然不明白以下内容:
a) 为什么手动将 ${startTimes}
元素传递到 bc
时没有解析错误,而 for
循环也没有有效,但输出解析错误(在 shell 脚本之外)?
b) 尽管存在解析错误,但我得到了我想要的结果数组。我应该忽略错误吗?
c) 在命令开头添加 #!/bin/bash
时(仍然在 shell 脚本之外,只是在命令行中)为什么无法访问结果? (输入 echo ${msValuesArray[@]}
返回一个空数组。)
d) 在 shell 脚本中运行时,是否发生了同样的错误但只是没有打印到终端?
感谢任何帮助。谢谢。
最佳答案
您可以直接遍历数组而不是通过索引:
for t in "${startTimes[@]}"; do
msValuesArray+=($(bc <<< "$t / 44.1"))
done
这使循环更易于阅读。
你得到一个解析错误,因为你试图访问一个不存在的元素(参见 John1024 的回答),所以 bc
只看到 /44.1
。您不应忽略该错误。
你应该引用你的 here-string,即使在这个例子中它似乎不会引起问题1。
如果你只是在命令行输入#!/bin/bash
,它根本没有任何作用,它只是被认为是注释。它只在脚本的第一行做一些事情,即指示应该使用什么解释器。如果,如您的评论所示,您将整个内容输入一行作为
#!/bin/bash; for ... (etc) ...
什么都没有发生。这只是一个评论。
最后,您正在截断结果。如果你想让它们更精确,你可以将 scale
设置为一个合理的值,如
bc <<< "scale = 3; $t / 44.1"
1 诸如(不需要的)分词和通配等问题。 This article很好地概述了引用的方式和原因。
关于Bash bc 返回 (standard_in) 1 : parse error only when part of for loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45927317/
我有两个几乎相同的 bash 脚本。一个有效,一个无效,我不知道发生了什么。以下是脚本: 这个很好用: #!/bin/bash CURDIR=$HOME/Documents/Development/r
我试图在以下的可执行文件中找到 myfunc 的位置: #include void myfunc(){ printf("Hello"); } int main(){ } 我写了这个脚本: #
我正在尝试生成一些准随机数以输入蒙特卡洛模拟。我正在使用bash。我似乎遇到了语法错误,现在我将范围缩小到了这段代码。 randno4=($RANDOM % 100001) upper_limit4=
我正在遍历整数数组 ${startTimes}(音频文件中的标记位置,样本中)并使用 bc 将这些整数转换为毫秒.我将结果传递到新数组 ${msValuesArray}。如果我一次运行每个数组元素,它
我最近将 iTerm2 更新到 3.2.4 版,然后更新到 3.2.5,我得到 (standard_in) 1: parse error每次开始新的 fish session 。 (在两个版本上 -
我是一名优秀的程序员,十分优秀!