Bash 使用if语句比较空白变量

Bash 使用if语句比较空白变量,bash,if-statement,Bash,If Statement,当我比较一个空白变量和一个字符串时,我得到了下面的错误 [: !=: unary operator expected 下面是我脚本中的一行 if [ $monthlystatus = Completed ];then command x 当我试图改变这一点如下 if [ "$monthlystatus" = Completed ];then command x 它不会给我预期的结果,即如果语句给我错误的结果。 例如,当我使用双引号时,即使变量monthlystatus的值等于Compl

当我比较一个空白变量和一个字符串时,我得到了下面的错误

[: !=: unary operator expected
下面是我脚本中的一行

if [ $monthlystatus = Completed ];then

command x
当我试图改变这一点如下

if [ "$monthlystatus" = Completed ];then

command x
它不会给我预期的结果,即如果语句给我错误的结果。 例如,当我使用双引号时,即使变量monthlystatus的值等于Completed,但仍然没有执行命令x

下面是真正的代码

if [ $monthlystatus != Failed ] && [ $monthlystatus != Aborted ];then

cat /home/a-hkataria/objectstatus_filesystem2.txt /home/a-hkataria/objectstatus_filesystem3.txt > /home/a-hkataria/objectstatus_filesystem4.txt

awk '$2 = $2 FS "Yes"'  /home/a-hkataria/objectstatus_filesystem4.txt

else

cat /home/a-hkataria/objectstatus_filesystem2.txt /home/a-hkataria/objectstatus_filesystem3.txt > /home/a-hkataria/objectstatus_filesystem4.txt

awk '$2 = $2 FS "No"'  /home/a-hkataria/objectstatus_filesystem4.txt

fi

因此,如果变量
monthlystatus
为空,则会显示错误,并且当我使用双引号时,变量的偶数值
已完成
,但仍不会在第二列中显示

您的第二种方法是正确的。需要引用变量。演示:

while read -r line; do
    [ "$line" = Completed ] && echo "true1 for =$line=" || echo "false1 for =$line="
    [[ "$line" == Completed ]] && echo "true2 for =$line=" || echo "false2 for =$line="
    [[ "$line" =~ ^Completed$ ]] && echo "true3 for =$line=" || echo "false3 for =$line="
    echo
done <<EOF
Completed
completed
Completediano
not Completed
notCompleted

etc
EOF

“不工作”不是问题描述。请阅读。给出的示例不是示例(不完整或不可验证)。显示真实代码。用真实代码更新问题。@HiteshKataria表示变量
monthlystatusXX
未设置或包含空字符串(除非
set-e
处于活动状态,在这种情况下,未获取错误表示已设置,但包含空字符串)。使用@CharlesDuffy建议的技术,但是如果您确实想用这种方式扩展字符串,请添加大括号,以便shell使用正确的变量名:
echo“XX${monthlystatus}XX”
true1 for =Completed=
true2 for =Completed=
true3 for =Completed=

false1 for =completed=
false2 for =completed=
false3 for =completed=

false1 for =Completediano=
false2 for =Completediano=
false3 for =Completediano=

false1 for =not Completed=
false2 for =not Completed=
false3 for =not Completed=

false1 for =notCompleted=
false2 for =notCompleted=
false3 for =notCompleted=

false1 for ==
false2 for ==
false3 for ==

false1 for =etc=
false2 for =etc=
false3 for =etc=