2015-11-02 79 views
0

我不是Bash專家,我很困惑爲什麼我的代碼無法工作。如何設置其值可能爲空的Bash變量?

隨着

od = `pip list --outdated | cut -d ' ' -f 1`; if [ ${#od} -eq 0 ]; then echo 'Up to date'; else echo 'Outdated stuff!'; echo pip install -U $od; fi 

我得到

od: =: No such file or directory 
od: =: Bad file descriptor 
-bash: 0: command not found 
-bash: [: -neq: unary operator expected 

我在做什麼錯在這裏,當我嘗試設置測試的輸出爲過時的包的名字給一個變量列表?

+4

http://shellcheck.net是一個有用的工具。 –

+3

'foo = bar'與'foo = bar'完全不同。 –

+0

@TomFenech:我的日子過去了! – orome

回答

1

不要把周圍的=操作空間分配。

od=`pip list --outdated | cut -d ' ' -f 1`; if [ ${#od} -eq 0 ]; then echo 'Up to date'; else echo 'Outdated stuff!'; echo pip install -U $od; fi 

另外,不要用背蜱,包子炮彈$(...)代替:

od=$(pip list --outdated | cut -d ' ' -f 1); if [ ${#od} -eq 0 ]; then echo 'Up to date'; else echo 'Outdated stuff!'; echo pip install -U $od; fi 

最後,檢查簡單的方法如果od爲空值:

if [ ! "$od" ]; then ... 

因此給出:

od=$(pip list --outdated | cut -d ' ' -f 1); if [ ! "$od" ]; then echo 'Up to date'; else echo 'Outdated stuff!'; echo pip install -U $od; fi 
+0

看起來不錯。我可能會使用'read -a'或類似的方法來實際使用一個數組,而不是依靠字符串分割來做正確的事情,但是有一個參數可以用來解釋角落案例(比如非默認的IFS值)並不是特別可能。 –

+0

嘿。實際上,我並不喜歡使用隱含的'-n'參數來測試,因爲有可能測試的數據看起來像測試命令語法。當然,真正令人討厭的情況只有在使用'-a'或'-o'時纔會出現(因此它們在當前的POSIX標準中被棄用),而最糟糕的情況可以真正得到雙參數的使用,就像這樣無害的錯誤進入stderr和一個正確的(falsey)退出狀態,但... *聳肩*。 –

0
od=`pip list --outdated | cut -d ' ' -f 1`; if [ ${#od} -eq 0 ]; then echo 'Up to date'; else echo 'Outdated stuff!'; echo pip install -U $od; fi 

擺脫空間的周圍=