在 for 循环中测试未设置的变量

在 for 循环中测试未设置的变量

我编写了一个脚本,它可以解析文件并根据文件内的固定宽度设置变量。

然后我想检查每个变量,如果是空白字段,则将其设置为“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

因此只有两次迭代,等于num13如果你想有四次迭代,等于num1(null)3和 (null),那么你需要说

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

您应该引用 shell 变量引用,除非您有充分的理由不这样做,并且您确定您知道自己在做什么。

所以,

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

将导致

num is 1
num is 
num is 3
num is 

现在,如果你想要的结果是,,,,1很简单030

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

注意

  • [,之前和之后必须有空格
  • =,之前和之后必须有空格
  • 之前必须有空格] (如果之后还有其他内容,则之后也必须有空格),并且
  • fi拼写if错误。

但你的问题标题提到“未设置变量”  。two并且four为空字符串; fivesix(以及,,,orange以及其他潜在变量名的准无限列表)是pumpkintiger取消设置。有区别。如果是你感兴趣的,你需要问一个不同的问题,因为如果你这样做

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

那么就无法区分fivesixorangepumpkintiger迭代与twofour迭代 — num在所有七种情况下都将设置为空字符串。您需要直接测试$four$five(等)变量。

PS 不要问新问题;进行搜索。这个问题之前已经回答过了。

相关内容