语法错误在bash 4.1下运行命令bc

时间:2014-10-30 16:49:23

标签: bash scripting bc

我有一个包含以下行的bash脚本。变量start_timestart_files[$i]是浮点数。我想使用命令bc进行比较,如下所示:

result1=$(bc -l <<< $start_time'>='${start_files[$i]})

当我运行脚本时,我总是收到以下错误。

(standard_in) 1: syntax error

我已经检查过这个错误是由于这一行造成的。我究竟做错了什么?当使用bash 4.1时,这种情况发生在我身上,使用bash 4.3运行正常。但是我需要使用bash 4.1运行脚本。

bc命令有效但输入不起作用。使用此命令从文件中读取变量start_files

IFS=, read -r -a start_files <<< $(head -n 1 file.txt)

基本上我想读取由昏迷分隔的第一行中的所有值,并将它们存储到数组的不同位置。但是,使用bash 4.1,所有值最终都存储在start_files[0]中。我怎么解决这个问题?这行适用于bash 4.3

4 个答案:

答案 0 :(得分:1)

我建议您使用双引号:

result1=$(bc -l <<<"$start_time >= ${start_files[$i]}")

这样,您将回显一个包含变量的bc字符串。

答案 1 :(得分:0)

您是否正在读取具有DOS样式行结尾的文件中的值?

$ start_time=$'1.5\r'
$ i=1
$ start_files[$i]=$'2.5\r'
$ bc -l <<< "$start_time >= ${start_files[$i]}"
(standard_in) 1: illegal character: ^M
(standard_in) 1: illegal character: ^M

答案 2 :(得分:0)

您可以避免使用here-string,添加双引号并删除$

result1=$(echo "$start_time >= ${start_files[i]}" | bc -l)

答案 3 :(得分:0)

这将有助于您使用bc的版本。我猜这两个系统的情况并不相同。顺便说一下,你的错误与Bash无关。

POSIX bc明确指出POSIX' bc Specification中的比较(relational_expression}只能出现在whileforif中构造。

所以,首先你要尝试的是:

bc <<< "if($start_time >= ${start_files[$i]}) 1 else 0"

这可能不起作用,因为POSIX&#39; bc 不允许else语句中的if子句。 (尽管看起来很惊人,但你正确地阅读了最后一句话。)

如果你的bc确实是POSIX卡住了,那么你就必须做一些丑陋的事情,例如,

bc <<< "ret=0; if($start_time >= ${start_files[$i]}) { ret=1 } ret"

甚至更糟糕的事情(对不起,我在这里没有POSIX bc,所以我无法进行实验 - 如果有人手边有一个或者记得他的语法不在请使用正确的语法编辑此行。

祝你好运!