Я написал скрипт, который анализирует файл и устанавливает переменные в соответствии с фиксированной шириной внутри файла.
Затем я хочу проверить каждую переменную и, если это пустое поле, установить значение "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
и six
(и orange
, 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
(и т. д.) напрямую.
P.S. Не задавайте новый вопрос, сделайте поиск. На этот вопрос уже был дан ответ.