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

如何在纯POSIX Shell中将"$@"存入变量以传递参数?

在纯POSIX Shell中保留"$@"参数结构的方法

直接执行ARGS="$@"会将所有参数拼接成单一字符串,丢失参数间的独立分隔(比如带空格的参数会被拆分成多个)。在纯POSIX Shell中,由于没有数组支持,可通过以下方法保存并复用"$@"的完整参数结构:

方法1:直接传递参数(最安全推荐)

如果只是需要将当前参数传递给其他程序或函数,无需额外存储,直接在调用时使用"$@"即可,这是最安全且简单的方式:

# 示例:将当前参数传递给另一个函数
my_func() {
  # 在函数内用"$@"访问传递的完整参数列表
  target_command "$@"
}

# 调用函数时传入当前参数
my_func "$@"

方法2:用位置参数备份与恢复(纯POSIX兼容)

如果需要临时保存参数,之后再恢复使用,可以通过循环将每个参数存入单独的变量,再通过set --命令恢复位置参数:

# 保存当前参数
old_arg_count=$#
i=1
while [ $i -le $old_arg_count ]; do
  eval "old_arg_$i=\${$i}"
  i=$((i+1))
done

# 执行其他操作,比如修改当前位置参数
set -- new_arg1 new_arg2
echo "当前临时参数:$@"

# 恢复原来的参数
set --
i=1
while [ $i -le $old_arg_count ]; do
  eval "arg=\$old_arg_$i"
  set -- "$@" "$arg"
  i=$((i+1))
done

# 现在可以用恢复后的参数调用程序
target_command "$@"

方法3:用eval构造参数字符串(需注意安全)

可以将每个参数转义后拼接成字符串,再通过eval执行调用。此方法需处理参数中的特殊字符(如单引号),且存在安全风险(若参数包含恶意代码可能被执行):

# 构建转义后的参数字符串
args_str=""
for arg in "$@"; do
  # 转义参数中的单引号,避免eval解析错误
  escaped_arg=${arg//\'/\'\\\'\'}
  args_str="$args_str '$escaped_arg'"
done

# 通过eval调用目标程序
eval "target_command $args_str"

内容的提问来源于stack exchange,提问作者Adel M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:43:11