Bash脚本传入含管道符|的命令行参数无法正确输出如何解决?
问题原因
- 该问题和脚本内部的变量处理逻辑无关,根因出现在调用脚本时父Shell的命令行解析阶段。
你执行脚本时应该使用了类似./test.sh |ls的写法,|是Shell的内置管道符,会被父Shell优先解析:父Shell会将管道前的命令输出作为管道后ls命令的输入,同时不会将|ls作为参数传递给你的脚本,最终表现为直接打印目录列表。 - read读取输入不会触发该问题的原因:
read是从标准输入读取内容,你手动输入的|ls属于输入流内容,不会被Shell当成命令行特殊符号解析,会直接作为普通字符串赋值给变量,因此可以正常输出。
解决方法
调用脚本时,将包含Shell特殊符号(包括|、&、*、空格等)的参数用单引号或者双引号包裹即可,示例:
# 单引号包裹(推荐,单引号内所有字符都会被识别为普通文本) ./test.sh '|ls' # 双引号包裹也可实现效果 ./test.sh "|ls"
完成上述修改后,你脚本中原有的echo "Hello, $1."写法即可正常输出Hello, |ls,无需修改脚本内部逻辑。
内容的提问来源于stack exchange,提问作者PSKP
相关产品推荐
相关产品推荐

