2017-04-02 41 views
0

当我比较字符串我收到以下错误使用比较空白的变量,如果声明

[: !=: 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是空白的它给我的错误,当我使用双引号,即使变量的值是Completed但仍然没有在第二列显示yes

+1

“不工作” 是没有问题的描述。请阅读[mcve]。 – melpomene

+0

给出一个示例 –

+0

这不是一个示例(它不完整或可验证)。显示真实的代码。 – melpomene

回答

1

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

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 

输出

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=