2017-04-02 39 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=