在我的bash脚本中,我有一个函数为后面的main函数的条件返回0或1(true或false)。
function1 () {
if [[ "${1}" =~ "^ ...some regexp... $" ]] ; then
return 1
else
return 0
fi
}
然后在我的主要功能中:
main () {
for arg in ${@} ; do
if [ function1 ${arg} ] ; then
...
elif [ ... ] ; then
...
fi
done
}
然而,当我运行这个脚本时,它总是给我一个错误信息“[:function1:一元运算符预期”
有人可以帮我吗?
答案 0 :(得分:29)
您犯了一个常见错误,即假设[
是if
命令语法的一部分。它不是; if
的语法只是
if command; then
... things which should happen if command's result code was 0
else
... things which should happen otherwise
fi
我们使用的常见command
之一是[
,它是命令test
的别名。这是一个比较字符串,数字和文件的简单命令。它接受一个相当狭窄的参数组合,如果你没有传递预期的参数,往往会产生令人困惑和误导性的错误消息。 (或者更确切地说,一旦你习惯了它,错误信息就足够了,但如果不使用它们很容易被误解。)
在main
功能中,对[
的调用似乎放错地方了。你可能意味着
if function "$arg"; then
...
elif ... ; then ...
顺便说一下,为了更好的衡量,你也应该总是引用你的字符串。使用"$1"
而非$1
和"$arg"
代替$arg
。
test
作为一般厨房的历史原因,作者不想参与if
的语法,这是原始Bourne shell的一个不太吸引人的设计。 Bash和zsh
提供的选项不那么笨重(比如你在[[
定义中使用的bash中的function1
双括号),当然,POSIX test
是比贝尔实验室最初的创作更加温和。
作为补充说明,您的功能可以简化为
function1 () {
! [[ "$1" =~ "^ ...some regexp... $" ]]
}
即,使用[[
执行测试并反转其结果代码。 (“正常”情况是返回0表示成功,但是您可能正在尝试验证字符串不匹配?)