переменная нулевой длины добавлена ​​для неработающей итерации

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

0
задан 15 June 2020 в 23:00

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

  1. Есть несколько исключений - см., Например, Когда необходимо двойное цитирование?
0
ответ дан 19 June 2020 в 21:24

Другие вопросы по тегам:

Похожие вопросы: