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。
我有 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。