如何在纯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.
相关产品推荐
相关产品推荐

