Testando variáveis ​​não definidas em um loop for

Testando variáveis ​​não definidas em um loop for

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 forafirmação é interpretada como

for num in 1  3

e portanto existem apenas duas iterações, com numigual a 1e 3. Se você quiser ter quatro iterações, com numigual a 1, (nulo) 3e (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é ifescrito ao contrário.

Mas o título da sua pergunta menciona “variáveis ​​não definidas”.  twoe foursãodefinirpara uma string em branco; fivee six(e orange,,, e uma lista quase infinita de outros nomes de variáveis ​​potenciais) pumpkinsãotigerdesarmar. 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, pumpkine tiger, das iterações twoe four- numserá 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.

informação relacionada