如何在 bash 中创建和使用所有输入参数(“$@”)的备份副本?

Gab*_*les 1 bash shell parsing arguments

我需要能够备份并稍后使用(读取和打印以及作为参数传递给另一个命令)所有输入参数到 bash 程序,但无法弄清楚。这是我的尝试:

back_up_all_input_args.sh:

#!/usr/bin/env bash

all_args1="$@"
all_args2="$(printf "%q " "$@")"

# Simulate parsing the input args here
# - see: https://stackoverflow.com/a/14203146/4561887
shift # remove 1st arg
shift # remove 2nd arg

echo "$@"
echo "$all_args1"
echo "$all_args2"

# Do another program call with all input args here
# rg "$all_args1"  # FAILS
# rg "$all_args2"  # FAILS
Run Code Online (Sandbox Code Playgroud)

示例运行和输出:

$ ./backup_all_input_args.sh arg1 "arg 2" "arg 3"
arg 3
arg1 arg 2 arg 3
arg1 arg\ 2 arg\ 3 
Run Code Online (Sandbox Code Playgroud)

我的第一个方法是用 来支持论点all_args1="$@"。这失败了,因为我失去了引号并得到了arg1 arg 2 arg 3. 我的第二种方法是用 来支持论点all_args2="$(printf "%q " "$@")"。这失败了,因为我再次丢失了引号,而且恰好第一个参数不仅需要像文件路径一样与反斜杠粘在一起,而且它是一个正则表达式参数,因此需要保留真正未修改。因此,这不等于原始输入:arg1 arg\ 2 arg\ 3

到目前为止我已经研究过的参考文献

  1. 如何在 Bash 参数中保留引号?
  2. 如何在打印 bash 脚本的参数时保留引号
  3. 如何解析 Bash 中的命令行参数?

bash 演示

更新:现在我有了答案,这个问答对我刚刚写的这些 bash 演示做出了贡献:

  1. back_up_all_input_args.sh
  2. array_practice.sh
  3. ...并最终形成了我围绕 Ripgrep 编写的快速查找和替换工具包装器

Joh*_*ica 5

添加括号并将它们存储在数组中。这会将每个参数保留为单独的单词,并避免所有反斜杠逃避复杂性。

all_args=("$@")
Run Code Online (Sandbox Code Playgroud)

然后您可以将参数传递给另一个命令:

cmd "${all_args[@]}"
Run Code Online (Sandbox Code Playgroud)

或者打印出来:

printf '[%s]\n' "${all_args[@]}"
Run Code Online (Sandbox Code Playgroud)

或者将它们分配给另一个数组:

args_copy=("${all_args[@]}")
Run Code Online (Sandbox Code Playgroud)

您还可以使用set恢复脚本的原始$1$2等参数:

set -- "${all_args[@]}"
Run Code Online (Sandbox Code Playgroud)