发现这个错误非常奇怪,因为之前我的脚本正在运行,但是当我从服务器移动它后,我正在使用我的本地机器,它停止工作,只是给了我一个'意外的操作员'错误.
# Else if the script is being run in the arrayscripts directory, add /output/ ... elif [ $basePath == "arrayscripts" ]; then echo "$dscr has started to run." cpuPath="`pwd`/output/cpu.binary" txtPath="`pwd`/output/cpu.txt" csvPath="`pwd`/output/cpu.csv"
Charles Duff.. 10
如果你的实际shell是/bin/sh
[与初始问题相反,但正如讨论评论所阐明的那样],请使用=
而不是==
在测试表达式中:
elif [ "$basePath" = arrayscripts ]
需要注意的是,右侧没有需要在这种情况下被引用,因为它不包含任何的扩张和没有语法敏感字符.
或者,如果在使用bash时此问题是可重现的,那么显而易见的问题是缺少引号.
使用其中之一
[ "$basePath" = arrayscripts ] # this is POSIX compatible
要么
[[ $basePath = arrayscripts ]] # this works only with bash
否则,$basePath
扩展的参数数量是未定义的 - 它可以扩展为零参数,从而生成语句
[ = arrayscripts ]
...它会尝试=
用作一元运算符,但它不是......
或者,如果$basePath
包含,"true -o bar ="
它可以扩展成类似的东西
[ true -o bar = arrayscripts ]
...导致程序行为与您实际想要的非常不同.
底线:当编写遵循POSIX规则的shell(基本上,除了zsh或fish之外的任何东西)时,引用您的扩展,除非您有特定且令人信服的理由不这样做.(使用bash/ksh扩展[[ ]]
提供了这样一个原因,通过引入一个上下文,其中不会发生扩展结果和全局扩展的字符串拆分).