为什么这会失败?
~$ 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"'
现在可以通过我的帮助来实现。
答案 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