移除$@变量中的noglob,解决Shell脚本传参异常问题
noglob的问题 老哥,你遇到的这个问题我之前也碰到过几次,大概率不是noglob选项本身的锅——毕竟noglob只是控制Shell通配符展开的开关,不会平白无故把你的参数替换成它自己的名字。咱们一步步来排查:
先检查是不是被别名坑了
有时候我们会给常用脚本设别名,万一你不小心把a.sh设成了带noglob的别名呢?比如之前可能执行过类似alias a.sh='bash noglob a.sh'这种奇怪的命令。你在终端里敲alias | grep a.sh看看有没有相关别名,如果有,直接用unalias a.sh取消,然后再试一次传参数123。检查脚本内部的参数处理逻辑
打开你的a.sh看看核心代码,是不是把输出参数的地方写错了?比如本来应该写echo $1(输出第一个参数),结果写成了echo noglob?或者错误引用了叫noglob的变量?比如:正确的参数输出应该是这样:
#!/bin/bash echo "传入的参数是:$1"如果你的脚本里是硬编码输出
noglob,那不管传什么参数都会输出这个字符串,这就很好改了。排查Shell环境变量的冲突
有没有可能你的Shell环境里$1这个位置参数被意外赋值了?比如在~/.bashrc或者~/.profile里不小心写了1=noglob这种错误配置?你直接在终端里敲echo $1看看输出是什么,如果输出是noglob,那说明你的Shell会话里$1被设置成了这个值,这时候得去检查你的Shell配置文件,把错误的赋值删掉。纠正你对
noglob选项的操作
你之前用的unset noglob和set noglob off都是错的——noglob是Shell的选项,不是变量,不能用unset。正确的关闭方式是set +o noglob,开启是set -o noglob。不过还是那句话,这个选项和你现在的问题没关系,不用在这上面纠结。
按照上面的步骤排查,大概率能找到问题所在。
内容的提问来源于stack exchange,提问作者Gvtha

