You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本中如何转义"string"$arg以实现多命令执行?

问题分析与解决

为什么直接执行和脚本里结果不同

在Bash中直接执行ping google.com|cat 1.txt时,Shell会把|解析为命令管道,将ping的输出传递给cat命令。但脚本里把arg='google.com |cat 1.txt'赋值给变量后直接展开$addr时,Shell不会解析管道符号,而是把|cat和1.txt都当作ping的目标主机名,所以会出现ping: 1.txt: Name or service not known的错误。

"string"$arg的作用

"ping -c 1 "$addr本质是字符串拼接:把双引号包裹的ping -c 1 (注意末尾的空格)和$addr的内容拼接成一个完整字符串。但这里的变量展开只做单词拆分(按空格分割成多个参数),不会识别|、;这类Shell元字符,它们会被当作普通的参数内容处理。

实现多命令执行的方法

要让Shell解析变量中的元字符,需要用eval命令——它会重新对拼接后的字符串做Shell语法解析,把元字符当作命令分隔符处理。

修改脚本的执行逻辑:

# 假设原脚本接收第一个参数作为arg
addr="$1"
# 拼接完整命令字符串
addr="ping -c 1 $addr"
# 使用eval解析并执行命令
eval "$addr"

这样当你传入arg='google.com |cat 1.txt'时,eval会正确识别管道符号,先执行ping -c 1 google.com,再将其输出传递给cat 1.txt执行。

注意:eval存在安全风险,如果$addr包含不可信的用户输入,可能会执行恶意命令,仅在参数可控的场景下使用。

内容的提问来源于stack exchange,提问作者chanra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:37:18