遭遇;应为一元运算符“;在bash脚本中
在我的bash脚本中,我有一个函数返回0或1(true或false)作为后面主函数的条件遭遇;应为一元运算符“;在bash脚本中,bash,if-statement,unary-operator,Bash,If Statement,Unary Operator,在我的bash脚本中,我有一个函数返回0或1(true或false)作为后面主函数的条件 function1 () { if [[ "${1}" =~ "^ ...some regexp... $" ]] ; then return 1 else return 0 fi } 然后在我的主要功能中: main () { for arg in ${@} ; do if [ function1 ${arg} ] ;
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:unary operator expected”
有人能帮我吗?你犯了一个常见的错误,认为
[
是if
命令语法的一部分。事实并非如此;if
的语法很简单
if command; then
... things which should happen if command's result code was 0
else
... things which should happen otherwise
fi
我们常用的命令之一是[
这是命令test
的别名。它是一个比较字符串、数字和文件的简单命令。它接受相当窄的参数组合,如果不传递预期的参数,往往会生成令人困惑和误导的错误消息。(或者更确切地说,一旦您习惯了错误消息,它就足够了,而且非常有用,但如果您不习惯,它们很容易被误解。)
在您的main
函数中,对[
的调用似乎放错了位置。您的意思可能是
if function "$arg"; then
...
elif ... ; then ...
顺便说一句,为了更好地衡量,您还应该始终引用字符串。使用“$1”
而不是$1
,使用“$arg”
而不是$arg
test
作为一般厨房洗涤槽的历史原因作者不想成为语法的一部分,如果
是原始Bourne shell的一个不太吸引人的设计。Bash和zsh
提供了不太笨重的替代品(如[[
bash中的双括号,您在函数1
定义中使用了它),当然,POSIX测试
比贝尔实验室最初的创建要温和得多
作为补充说明,您的函数可以简化为
function1 () {
! [[ "$1" =~ "^ ...some regexp... $" ]]
}
也就是说,使用[[
执行测试并反转其结果代码。(正常情况下,如果成功,则返回0,但可能您正在尝试验证字符串是否匹配?这些…表示${1}之后的脚本,在我的实际脚本中,我小心地将脚本和方括号分割成一个空格。因此我认为这不是问题所在。不,我的函数1实际上检查$1是否与某种正则表达式匹配。我的函数1单独运行时效果很好。所以我认为我的主函数中的条件存在一些问题onOh,抱歉,错过了main
中的错误。感谢您的提示。基本分析仍然有效;[
不是你想象的那样。谢谢!我不应该在我的main条件中使用括号。谢谢!我重新调整了这个答案的用途,这是一个更为集中的问题。如果你链接到这里,也许可以点击更新的问题。请注意,至少在bash版本4中,你不应该引用正则表达式:这样做会强制简单字符串匹配--。另外,你应该在“$@”
中为arg使用,或者更简单的为arg;do…
你应该把你的正则表达式放在一个变量中。pattern='^…一些regexp…$”;如果[[$1=~$pattern]]
。请注意,在双方括号内,没有必要引用变量,正如glenn所说的,正则表达式(变量)不应被引用。