Bash脚本启动服务时出现表达式语法错误求助
问题根源与修复方案
这个错误的原因非常明确:你在判断参数数量时用错了变量!
在start_services函数里,你写了:
if [[ $@ -eq 0 ]]; then
但$@代表的是所有传入的位置参数本身(比如你调用时传入的start users),而-eq是用来做数字比较的。当shell尝试解析[[ start users -eq 0 ]]时,自然会报错——start users不是一个合法的数字表达式,这就是你看到syntax error in expression (error token is "users")的原因。
修复方法
把判断条件里的$@换成$#,$#才是专门用来获取位置参数数量的变量:
if [[ $# -eq 0 ]]; then
为什么脚本功能还能正常工作?
虽然语法错误会被抛出,但脚本并没有终止执行——因为当你调用start_services "$@"时,传入的参数是start users,此时$#的值是2,所以条件判断不成立,直接进入了else分支。在else里你用shift去掉了第一个参数start,然后处理剩下的users,所以功能看起来是正常的,但那个语法错误会每次都触发。
额外的小建议
- 在后台启动服务时,
& > /dev/null的写法可以简化成&>/dev/null(bash支持这种合并重定向的写法)。 - 为了避免服务名包含特殊字符的问题,遍历服务时最好用
"$svc"和"$var"(你已经在else分支里这么做了,for循环里的"$@"也很规范,这点做得不错)。
内容的提问来源于stack exchange,提问作者jberthia
相关产品推荐
相关产品推荐

