Prueba de variables no configuradas en un bucle for

Prueba de variables no configuradas en un bucle for

Escribí un script que analiza un archivo y establece variables de acuerdo con un ancho fijo dentro del archivo.

Luego quiero verificar cada variable y, si es un campo en blanco, establecerlo en "0". Una variación simple de esto sería:

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

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

me da una salida de:

num is 1   
num is 3

Lo que quiero hacer es codificar para if $two is null then two=0.

¿Cómo puedo hacer eso?

Respuesta1

Quieres el operador de comparación -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"

Respuesta2

Tu pregunta no tiene mucho sentido. En primer lugar, si dices

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

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

entonces la fordeclaración se interpreta como

for num in 1  3

y entonces solo hay dos iteraciones, numiguales a 1y 3. Si desea tener cuatro iteraciones, numiguales a 1, (nulo) 3y (nulo), entonces debe decir

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

Debe citar referencias de variables de shell a menos que tenga una buena razón para no hacerlo y esté seguro de saber lo que está haciendo.

Entonces,

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

resultará en

num is 1
num is 
num is 3
num is 

Ahora, si quieres que los resultados digan 1, 0, 3, 0es una simple cuestión de decir

for num in "$one" "$two" "$three" "$four"
do
    if [ "$num" = "" ]
    then
        num=0
    fi
    echo "num is $num"
done

Tenga en cuenta que

  • Debes tener espacios en blanco antes y después de [,
  • Debes tener espacios en blanco antes y después de =,
  • Debes tener espacios en blanco antes ] (y después, si hay algo más después), y
  • fise ifescribe al revés.

Pero el título de su pregunta menciona "variables no configuradas".  twoy foursoncolocara una cadena en blanco; fivey six(y orange, pumpkin, tigery una lista casi infinita de otros nombres de variables potenciales) sondesarmado. Hay una diferencia. Siesoes lo que te interesa, necesitas hacer una pregunta diferente, porque, si lo haces

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

entonces será imposible distinguir las iteraciones five, six, orange, pumpkiny , de las iteraciones y - se establecerá en una cadena en blanco en los siete casos. Necesitaría probar las variables y (etc.) directamente.tigertwofournum$four$five

PD: No hagas una nueva pregunta; haz una búsqueda. Esto ya ha sido respondido antes.

información relacionada