Вопрос прост. У меня есть следующий скрипт в 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 является единственным, который пуст, он имеет нулевую длину строки внутри. Первое «если» доказывает это, однако, когда я пытаюсь добавить переменные в итерацию «for», условие не распознается. Как я могу сделать эту работу? Мне нужно сделать это, так как у меня очень много переменных, которые нужно протестировать в одном цикле, и я не использую одно «если» для каждого из них. Большое вам спасибо.
Всегда заключайте в кавычки ваши расширения переменных 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