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

0

Eu escrevi um script que analisa um arquivo e define variáveis de acordo com uma largura fixa dentro do arquivo.

Eu, então, quero verificar cada variável e, se for um campo em branco, defina como "0". Uma simples variação 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 if $two is null then two=0 .

Como posso fazer isso?

    
por J Slater 09.12.2015 / 16:30

2 respostas

1

Você quer o operador de comparação -z link

if [ -z $two ]; then   ## or [ -z $num ] to test them all 
    two=0
fi
echo "num is $num"
    
por 10.12.2015 / 18:13
0

Sua pergunta não faz muito sentido. Primeiro de tudo, se você disser

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

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

, a declaração for é interpretada como

for num in 1  3

e, portanto, há apenas duas iterações, com num igual a 1 e 3 . Se você quiser ter quatro iterações, com num igual a 1 , (null), 3 e (null), então você precisa dizer

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

Você deve citar referências de variáveis de shell a menos que você tenha uma boa razão para não e você tem certeza de que sabe o que está fazendo.

Então,

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

resultará em

num is 1
num is 
num is 3
num is 

Agora, se você quiser que os resultados mostrem 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

Note que

  • Você deve ter espaço em branco antes e depois do [
  • Você deve ter espaço em branco antes e depois do =
  • Você deve ter espaço em branco antes do ] (e depois disso, se houver mais alguma coisa depois disso) e
  • fi é if soletrado para trás.

Mas o título da sua pergunta menciona "variáveis não definidas". two e four são set para uma string em branco; five e six (e orange , pumpkin , tiger , e uma lista quase infinita de outros nomes de variáveis potenciais) são não definidos . Existe uma diferença. Se isso é o que você está interessado, você precisa fazer uma pergunta diferente, porque, se você fizer

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

então será impossível distinguir o five , six , orange , pumpkin e tiger , iterações das iterações two e four - num será definido como uma string em branco nos sete casos. Você precisaria testar as variáveis $four e $five (etc.) diretamente.

P.S. Não faça uma nova pergunta; faça uma pesquisa. Isso foi respondido antes.

    
por 11.12.2015 / 22:46