为什么“su - -c”会导致失败?

时间:2014-04-28 19:41:23

标签: linux bash

为什么这会失败?

~$ su - -c "k=0; if ls | grep -q ^Desktop; then k=1; fi; if [ $k == 1 ]; then echo 1; fi"
Password: 
-bash: line 0: [: ==: unary operator expected

没有su - -c部分。

更新

这是一个简化的例子,我真正想要的是

ssh -t $host 'su - -c "k=0; if yum check-updates | grep -q ^kernel-; then k=1; fi; yum -y update; if [ \$k == 1 ]; then reboot; fi"'

现在可以通过我的帮助来实现。

1 个答案:

答案 0 :(得分:7)

这是因为你的shell会进行变量扩展(因为你使用的是双引号),并且很可能k扩展为空,因为它没有设置。请改为考虑:

su - -c "k=0; if ls | grep -q ^Desktop; then k=1; fi; if [ \$k == 1 ]; then echo 1; fi"

(逃脱美元)或:

su - -c 'k=0; if ls | grep -q ^Desktop; then k=1; fi; if [ $k == 1 ]; then echo 1; fi'

使用单引号阻止变量扩展。


顺便说一句,it's very bad to parse the output of ls!看来你的问题是确定名称以Desktop开头的文件或目录是否存在。使用一点启发式,我猜你真的意味着是否存在目录,其名称​​正好桌面。在这种情况下:

if [[ -d Desktop ]]; then k=1; fi

会好得多。如果不是在Bash(或在Bash中,但想避免Bashisms):

if [ -d Desktop ]; then k=1; fi