
Eu escrevi um script que analisa um arquivo e define variáveis de acordo com uma largura fixa dentro do arquivo.
Quero então verificar cada variável e, se for um campo em branco, definir como "0". Uma variação simples disso seria:
one=1
two=""
three=3
four=""
for num in $one $two $three $four
do
echo num is $num
done
me dá uma saída de:
num is 1
num is 3
O que eu quero fazer é codificar para if $two is null then two=0
.
Como eu posso fazer isso?
Responder1
Você quer o operador de comparação -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"
Responder2
Sua pergunta não faz muito sentido. Em primeiro lugar, se você disser
one=1
two=""
three=3
four=""
for num in $one $two $three $four
do
︙
então a for
afirmação é interpretada como
for num in 1 3
e portanto existem apenas duas iterações, com num
igual a 1
e 3
. Se você quiser ter quatro iterações, com num
igual a 1
, (nulo) 3
e (nulo), então você precisa dizer
for num in "$one" "$two" "$three" "$four"
Você deve citar referências de variáveis do shell, a menos que tenha um bom motivo para não fazê-lo e tenha certeza de que sabe o que está fazendo.
Então,
for num in "$one" "$two" "$three" "$four"
do
echo "num is $num"
done
vai resultar em
num is 1
num is
num is 3
num is
Agora, se você quiser que os resultados digam 1
, 0
, 3
, 0
, é uma simples questão de dizer
for num in "$one" "$two" "$three" "$four"
do
if [ "$num" = "" ]
then
num=0
fi
echo "num is $num"
done
Observe que
- Você deve ter espaços em branco antes e depois do
[
, - Você deve ter espaços em branco antes e depois do
=
, - Você deve ter um espaço em branco antes
]
(e depois dele, se houver mais alguma coisa depois dele) e fi
éif
escrito ao contrário.
Mas o título da sua pergunta menciona “variáveis não definidas”.
two
e four
sãodefinirpara uma string em branco;
five
e six
(e orange
,,, e uma lista quase infinita de outros nomes de variáveis potenciais) pumpkin
sãotiger
desarmar. Há uma diferença. Sequeé o que lhe interessa, você precisa fazer uma pergunta diferente, porque, se o fizer
for num in "$one" "$two" "$three" "$four" "$five" "$six" "$orange" "$pumpkin" "$tiger"
do
︙
então será impossível distinguir as iterações five
, six
, orange
,
pumpkin
e tiger
, das iterações two
e four
-
num
será definido como uma string em branco em todos os sete casos. Você precisaria testar as variáveis $four
e $five
(etc.) diretamente.
PS Não faça uma nova pergunta; faça uma pesquisa. Isso já foi respondido antes.