Тестирование неустановленных переменных в цикле for

Тестирование неустановленных переменных в цикле for

Я написал скрипт, который анализирует файл и устанавливает переменные в соответствии с фиксированной шириной внутри файла.

Затем я хочу проверить каждую переменную и, если это пустое поле, установить значение "0". Простая вариация этого будет такой:

one=1  
two=""  
three=3  
four=""  

for num in $one $two $three $four  
do  
   echo num is $num  
done

дает мне вывод:

num is 1   
num is 3

Я хочу написать код для if $two is null then two=0.

Как мне это сделать?

решение1

Вам нужен оператор сравнения -z http://tldp.org/LDP/abs/html/comparison-ops.html

if [ -z $two ]; then   ## or [ -z $num ] to test them all 
    two=0
fi
echo "num is $num"

решение2

Ваш вопрос не имеет особого смысла. Во-первых, если вы скажете

one=1
two=""
three=3
four=""

for num in $one $two $three $four
do

то forутверждение интерпретируется как

for num in 1  3

и поэтому есть только две итерации, с numравным 1и 3. Если вы хотите иметь четыре итерации, с numравным 1, (null) 3и (null), то вам нужно сказать

for num in "$one" "$two" "$three" "$four"

Вам следует заключать в кавычки ссылки на переменные оболочки, если у вас нет веской причины не делать этого и вы не уверены, что знаете, что делаете.

Так,

for num in "$one" "$two" "$three" "$four"
do
    echo "num is $num"
done

приведет к

num is 1
num is 
num is 3
num is 

Теперь, если вы хотите, чтобы результаты были такими 1: 0, , 3, 0, то вам просто нужно сказать:

for num in "$one" "$two" "$three" "$four"
do
    if [ "$num" = "" ]
    then
        num=0
    fi
    echo "num is $num"
done

Обратите внимание, что

  • До и после [, должны быть пробелы.
  • До и после =, должны быть пробелы.
  • ] Перед (и после него, если после него есть что-то еще) обязательно должен быть пробел , и
  • fiпишется ifнаоборот.

twoНо в заголовке вашего вопроса упоминаются «неустановленные переменные»  four.наборв пустую строку; fiveи sixorange, pumpkin, tiger, и квазибесконечный список других потенциальных имен переменных)не установлен. Есть разница. Есличтоэто то, что вас интересует, вам нужно задать другой вопрос, потому что, если вы это сделаете,

for num in "$one" "$two" "$three" "$four" "$five" "$six" "$orange" "$pumpkin" "$tiger"
do

то будет невозможно отличить итерации five, six, orange, pumpkin, и tiger, от итераций twoи fournumбудет установлена ​​в пустую строку во всех семи случаях. Вам нужно будет проверить переменные $fourи $five(и т. д.) напрямую.

P.S. Не задавайте новый вопрос, сделайте поиск. На этот вопрос уже был дан ответ.

Связанный контент