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

Затем я хочу проверить каждую переменную и, если это пустое поле, установить в "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 .

Как я могу это сделать?

2 ответа2

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"
0

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

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 , (ноль), 3 и (ноль), то вам нужно сказать

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 и four итераций - num будет установлен в пустую строку во всех семи случаях.  Вам нужно будет напрямую проверить переменные $four и $five (и т.д.).

PS Не задавайте новый вопрос; сделать поиск.  На это уже отвечали раньше.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .