在命令行中,單引號('
)和雙引號("
)在某些情況下會有不同的效果,尤其是在涉及bash變量和特殊字符的解析時。在你給出的兩個命令中:
ps -ef|grep "tokenize"|grep -v grep|awk '{print $2}'
和
ps -ef|grep "tokenize"|grep -v grep|awk "{print $2}"
差異來自于單引號和雙引號對于$2
的處理:
-
當使用單引號
{print $2}
時,$2
是被當作字符串的一部分,表示awk應當打印出當前行的第二個字段。單引號會阻止shell對其進行變量展開,因此$2
這個表達式被完整地傳遞給了awk。 -
當使用雙引號
"{print $2}"
時,雙引號不會阻止shell變量替換。如果在執行這段命令的環境中,shell中恰好有一個名叫$2
的變量(比如在一個腳本中作為位置參數傳入),shell會先嘗試將$2
替換為對應的變量的值,然后才會執行awk。如果$2
變量不存在,它將被替換為空字符串,這可能會導致awk命令行為不正常或者輸出不正確。
在大多數的Unix-like系統中,使用單引號可以保證命令按照預期的方式運行,因為它將預防shell在傳遞給awk之前對內容進行任何處理。所以第一個命令'{print $2}'
更可靠,因為它會正確地被處理為awk命令打印每行的第二列。
如果兩個命令給出了不同的輸出,那可能是因為$2
在當前shell環境中已經有了一個值,而這個值在使用雙引號的情況下被插入到了awk命令中。通常在執行這些命令時,為了確保可靠性,建議使用單引號。