是否可以在bash中使用C-Type中的逻辑AND进行循环条件?

时间:2015-09-18 17:21:52

标签: bash for-loop conditional logical-operators

我有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部分)中使用逻辑运算符?如果是,我必须如何纠正我的脚本?如果没有,解决方案是什么?

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