2015-11-02 78 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 

摆脱空间的周围=