我正在尝试循环遍历字符串数组,并对其中一个值执行一些不同的操作。每个元素的字符串比较都失败。
arr[0]='red'
arr[1]='blue'
arr[2]='yellow'
arr[3]='green'
## now loop through the above array
for i in "${arr[@]}"
do
if [ "$i"="green" ];
then
echo "i('$i') is equal to green"
else
echo "i('$i') is not equal to green"
fi
done
我也尝试过(结果相同):
if [ "$i"='green' ];
和
if [ $i='green' ];
和
if [ $i="green" ];
上述每一项的输出:
i('red') is equal to green
i('blue') is equal to green
i('yellow') is equal to green
i('green') is equal to green
我在比较中做错了什么?
答案1
缺少空格。
[ $i="green" ]
方法[ -n $i=green ]
你需要
[ "$i" = green ]
甚至
[ green = "$i" ]
这甚至适用于i=-n
.
如果不需要移植到其他 shell,可以在 bash 中使用双方括号。
[[ $i = green ]]
不需要引号(事实上,在右侧它们有特殊含义 - 它们防止扩展)。您也可以使用==
代替=
。
答案2
=
比较运算符周围需要空格:
if [ "$i" = "green" ];
答案3
需要在 周围留有空格的原因=
是[
和test
命令根据您传递的参数数量执行不同的操作。当您仅传递单个参数 ( [ "$i"=green ]
) 时,如果字符串非空,则结果为 true。
您的代码和您的输出不匹配:鉴于您发布的代码,每种颜色都应该导致i('colour') is equal to green
答案4
[ green = "$i" ]
printf "( '%s' ) is %.$?0sequal to green.\n" "$i" "not "
...也可以。