我有bash脚本如下:
for ((; i < $var1 && $str1 -eq $str2; i++))
do
str2=$(command1)
done
导致以下错误:
第110行:i&lt; 5&amp;&amp; path -eq path:表达式中的语法错误(错误标记为&#34;路径&#34;)
我也尝试了以下变体,但发生了类似的sintax error
:
for ((; [ i < $var1 ] && [ $str1 -eq $str2 ]; i++))
for ((; [[ i < $var1 ]] && [[ $str1 -eq $str2 ]]; i++))
for ((; [[ i < $var1 && $str1 -eq $str2 ]]; i++))
我需要知道是否可以在Bash的C-Type循环条件部分(第2部分)中使用逻辑运算符?如果是,我必须如何纠正我的脚本?如果没有,解决方案是什么?
答案 0 :(得分:2)
在(( ... ))
内,由分号分隔的三个表达式都被计算为算术表达式。但是,-eq
不是在算术表达式中识别的运算符;它是条件表达式中的整数比较运算符。比较:
$ [[ 3 -eq 3 ]] && echo equal
equal
$ (( 3 == 3 )) && echo equal
equal
$ (( 3 -eq 3 )) && echo equal
bash: ((: 3 -eq 3 : syntax error in expression (error token is "3 ")
C风格的for
循环与C中的for
循环类似,但不完全相同。为了比较字符串,您需要通过一些扭曲来转换结果字符串与整数的比较,并将 与另一个整数进行比较。
for (( i=1; i < 3 && $([[ $str1 = $str2 ]]; echo $?) == 0; i++)); do
echo $i
done
这里,每次通过for
循环重新评估命令替换,如果=
计算结果为true,则生成0;如果计算结果为false,则生成1。
答案 1 :(得分:1)
(( ))
中的内容在算术上下文中进行评估,因此字符串比较实际上是非启动的:
$ i=1 var1=4 str1=foo str2=bar
$ (( i < var1 && str1 == str2 )) && echo y || echo n
y
这里$ str1(&#34; foo&#34;)和$ str2(&#34; bar&#34;)都被评估为数字(视为零),因此是相等的
只需将字符串填充到循环体中即可。
for ((; i < $var1; i++))
do
[[ "$str1" != "$str2" ]] && break
str2=$(command1)
done