if [ "$USER" != "root" || "$USER" != "XYZ" ]; then
echo succesful log
fi
错误是针对以上行。我该如何解决这个问题
答案 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
...但是,实际上,总是是真的,因为没有用户可以同时成为root
和XYZ
,所以所有值都将始终适用于OR
操作的一方或另一方。你真正想要的是找出它是否两者,而不是它是不是一个:
if [ "$USER" != root ] && [ "$USER" != XYZ ]; then
在采用ksh扩展(包括bash和zsh)的shell中,还提供了一种扩展形式的测试 - [[ ]]
- ,允许&&
和||
按字面意思使用,以及抑制字符串拆分,抑制glob扩展和添加新功能(模式匹配,正则表达式匹配等)。因此,如果只针对bash,ksh或类似的现代shell,也可以使用:
if [[ "$USER" != root && "$USER" != XYZ ]]; then
此处不需要在比较左侧进行扩展,因为字符串拆分和glob扩展(这些引号会抑制的行为)默认情况下是关闭的。他们在上面使用它们只是为了表现出良好的习惯。 (在比较的右侧,引用断言内容是字面的,而不是正则表达式或shell模式,因此可能是必要的。)