" [表达式||表达]"导致[:缺少`]'运行shell脚本时出错

时间:2015-04-07 12:52:53

标签: shell

if [ "$USER" != "root" || "$USER" != "XYZ" ]; then
echo succesful log
fi

错误是针对以上行。我该如何解决这个问题

1 个答案:

答案 0 :(得分:3)

根据per the APPLICATION USAGE section of the POSIX spec for test弃用XSI扩展程序-a-o

  

XSI扩展指定-a和-o二元原色和'('和')'运营商已被标记为过时。 (使用它们的许多表达式由语法模糊地定义,具体取决于要评估的特定表达式。)使用这些表达式的脚本应转换为下面给出的表单。尽管许多实现将继续支持这些过时的表单,但在处理用户提供的输入时,脚本应该非常小心,这些输入可能与这些以及其他原色和运算符混淆。除非应用程序开发人员知道产生脚本输入的所有情况,否则调用如:

因此,首选的解决方案是:

if [ "$USER" != root ] || [ "$USER" != XYZ ]; then

...但是,实际上,总是是真的,因为没有用户可以同时成为rootXYZ,所以所有值都将始终适用于OR操作的一方或另一方。你真正想要的是找出它是否两者,而不是它是不是一个

if [ "$USER" != root ] && [ "$USER" != XYZ ]; then

在采用ksh扩展(包括bash和zsh)的shell中,还提供了一种扩展形式的测试 - [[ ]] - ,允许&&||按字面意思使用,以及抑制字符串拆分,抑制glob扩展和添加新功能(模式匹配,正则表达式匹配等)。因此,如果只针对bash,ksh或类似的现代shell,也可以使用:

if [[ "$USER" != root && "$USER" != XYZ ]]; then

此处不需要在比较左侧进行扩展,因为字符串拆分和glob扩展(这些引号会抑制的行为)默认情况下是关闭的。他们在上面使用它们只是为了表现出良好的习惯。 (在比较的右侧,引用断言内容是字面的,而不是正则表达式或shell模式,因此可能是必要的。)