bash 中的循环条件是否可以在 C 类型中使用逻辑与?

Is it possible to use logical AND in C-Type for loop condition in bash?

我有 bash 脚本如下:

  for ((; i < $var1  && $str1 -eq $str2; i++))
  do
    str2=$(command1)      
  done

导致以下错误:

第 110 行:i < 5 && path -eq path:表达式语法错误(错误标记为 "path")

我也尝试了以下变体,但出现了类似的 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 类型 for 循环的条件部分(第 2 部分)中使用逻辑运算符?如果是,我必须如何更正我的脚本?如果没有,解决方案是什么?

(( )) 中的内容在 算术 上下文中进行评估,因此字符串比较确实是一个非初学者:

$ i=1 var1=4 str1=foo str2=bar
$ (( i < var1 && str1 == str2 )) && echo y || echo n
y

此处 $str1 ("foo") 和 $str2 ("bar") 都被评估为数字(视为零)因此相等

只需将字符串内容拉出到循环体中即可。

for ((; i < $var1; i++))
do
    [[ "$str1" != "$str2" ]] && break
    str2=$(command1)      
done

(( ... ))里面,用分号隔开的三个表达式都是算术表达式。但是,-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 循环相似但不完全相同。为了比较字符串,您需要经过一些扭曲才能转换字符串与整数比较的结果,并将 that 与另一个整数进行比较。

for (( i=1; i < 3 && $([[ $str1 = $str2 ]]; echo $?) == 0; i++)); do
    echo $i
done

在这里,每次通过 for 循环重新计算命令替换,如果 = 计算结果为真则生成 0,如果计算结果为假则生成 1。