使用 ubntu 18.04 我的 bash 脚本返回以下错误:
语法错误:无效的算术运算符(错误标记为“.00>0”)
我的代码如下:
echo Enter the number of images to be exported per folder!
read imperfol
echo Enter the path where the timestamp file is located!
read path_ts
num_images=$(< $path_ts wc -l)
num_folders=$(echo "scale=2 ; $num_images/ $imperfol" | bc)
if (($num_folders>0))
then
echo control 1
fi
我的意图是,我需要检查 if 语句中是否为“num_folder>0”。并且会有以下语句“num_folder>1”、“num_folder>2”等。
非常重要的一点是 num_folder 并不总是一个整数。
答案1
错误是因为使用 时scale=2
,bc
命令输出的浮点值类似于1.00
bash 1 shell 算术表达式((...))
无法处理的值。
$ num_folders=$(echo "scale=2 ; 1.0 / 1.0" | bc)
$ echo $num_folders
1.00
$ (($num_folders>0)) && echo Greater
-bash: ((: 1.00>0: syntax error: invalid arithmetic operator (error token is ".00>0")
然而
$ num_folders=$(echo "scale=0 ; 1.0 / 1.0" | bc)
$ echo $num_folders
1
$ (($num_folders>0)) && echo Greater
Greater
请注意,在内部,((...))
您可以仅通过名称引用变量,而无需取消引用$
,因此((num_folders>0))
也可以。还请注意,在 ((...)) 内部,<
and>
运算符确实是算术比较 - 而不是词汇比较,因为它们在“方括号”测试括号内。
您应该做什么取决于您的代码的意图 - 您可以在任何地方使用整数算术 - 如果这不是一个选项,那么就自己进行比较bc
:
$ echo "scale=2; (1.5 / 1.0) > 1" | bc
1
$ echo "scale=2; (0.5 / 1.0) > 1" | bc
0
并在您的(整数)shell 测试中使用结果。
1其他 shell,特别是 ksh93 和 zsh,能处理浮点运算。