Shell脚本问题:向函数传递'-n'参数为何失效?
为什么Shell函数接收'-n'参数时看似无法读取?
问题根本不在函数的参数接收逻辑,而是**echo命令的内置选项特性**导致的假象:
echo的-n是它的标准选项,作用是取消输出末尾的换行符。当你执行echo -n时,echo会把-n当成自身的选项处理,而不是需要打印的参数内容,所以不会输出任何可见字符,让你误以为函数没读取到-n参数。
验证方式
你可以在函数里添加额外的输出逻辑,比如给参数加包裹字符,就能看到函数其实已经正确接收到了-n:
func () { for arg in "$@" do echo "当前参数: '$arg'" done }
执行func -n会输出:当前参数: '-n',证明参数确实被接收了。
解决方案
有两种常用的修复方式:
- 使用
printf替代echoprintf不会把以-开头的内容当成选项,行为更稳定:
func () { for arg in "$@" do printf '%s\n' "$arg" done }
- 给
echo添加--终止选项解析--是大多数命令的标准写法,用来告诉命令:后面的内容都是普通参数,不再解析为选项:
func () { for arg in "$@" do echo -- "$arg" done }
修改后执行func -n,就能正常输出-n参数了。
内容的提问来源于stack exchange,提问作者Vinicius Gonçalves Melo
相关产品推荐
相关产品推荐

