问题很简单。我在 bash 中有以下脚本:
#!/bin/bash
a=`echo " 1 2 3 hello " | egrep -o "1"`
b=`echo " 1 2 3 hello " | egrep -o "2"`
c=`echo " 1 2 3 hello " | egrep -o "4"`
echo $a
echo $b
echo $c
echo "--"
echo "first print : "
if [ -z $c ]; then echo "zero length"; fi # condition met
echo "second print : "
for i in $a $b $c; do
if [ -z $i ]; then echo "zero length" # does not recognize variable $c , no print
fi
done
有 3 个变量,a、b 和 c。c 是唯一一个空变量,里面的字符串长度为零。第一个“if”证明了这一点,但是,当我尝试将变量添加到“for”迭代时,条件无法识别。我该如何让它工作?我需要这样做,因为我有很多变量需要在单个循环中测试,而不是对每个变量都使用单个“if”。非常感谢。
答案1
总是引用你的变量扩展1:
if [ -z "$c" ]; then echo "zero length"; fi
echo "second print : "
for i in "$a" "$b" "$c"; do
if [ -z "$i" ]; then echo "zero length"
fi
done
当$c
为空时,则为$a $b $c
仅包含两个项目的列表,因此仅执行两次迭代。您可以通过运行来看到这一点set -x
。在您的原始版本中:
second print :
++ for i in $a $b $c
++ '[' -z 1 ']'
++ for i in $a $b $c
++ '[' -z 2 ']'
而正确引用的版本是:
second print :
++ for i in "$a" "$b" "$c"
++ '[' -z 1 ']'
++ for i in "$a" "$b" "$c"
++ '[' -z 2 ']'
++ for i in "$a" "$b" "$c"
++ '[' -z '' ']'
++ echo 'zero length'
zero length
- 有一些例外 - 例如什么时候需要双引号?