如何创建和使用 bash 中所有输入参数(“$@”)的备份副本?
How can I create and use a backup copy of all input args ("$@") in bash?
我需要备份并稍后使用(读取和打印以及作为参数传递给另一个命令)所有输入参数到 bash 程序的能力,但无法弄清楚.这是我的尝试:
back_up_all_input_args.sh:
#!/usr/bin/env bash
all_args1="$@"
all_args2="$(printf "%q " "$@")"
# Simulate parsing the input args here
# - see:
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
样本运行并输出:
$ ./backup_all_input_args.sh arg1 "arg 2" "arg 3"
arg 3
arg1 arg 2 arg 3
arg1 arg\ 2 arg\ 3
我的第一个方法是用 all_args1="$@"
来支持论点。这失败了,因为我丢失了引号并得到 arg1 arg 2 arg 3
。我的第二种方法是用 all_args2="$(printf "%q " "$@")"
来支持论点。这失败了,因为我再次丢失了引号,而且恰好第一个参数不需要像文件路径一样与反斜杠粘在一起,而是一个 正则表达式 参数,所以它需要真正保持不变。因此,这不等于原始输入:arg1 arg\ 2 arg\ 3
.
我已经研究过的参考文献
- How to keep quotes in Bash arguments?
- How can I preserve quotes in printing a bash script's arguments
- How do I parse command line arguments in Bash?
Bash 演示
更新:这个问答,现在我有了答案,对我刚刚写的这些 bash 演示做出了贡献:
- back_up_all_input_args.sh
- array_practice.sh
- ...最终 this rapid find-and-replace tool wrapper 我写了关于 Ripgrep 的文章。
添加括号并将它们存储在数组中。这会将每个参数保留为单独的单词,并避免所有反斜杠转义的复杂性。
all_args=("$@")
然后您可以将参数传递给另一个命令:
cmd "${all_args[@]}"
或打印出来:
printf '[%s]\n' "${all_args[@]}"
或者将它们分配给另一个数组:
args_copy=("${all_args[@]}")
也可以使用set
还原脚本原</code>、<code>
等,参数:
set -- "${all_args[@]}"
我需要备份并稍后使用(读取和打印以及作为参数传递给另一个命令)所有输入参数到 bash 程序的能力,但无法弄清楚.这是我的尝试:
back_up_all_input_args.sh:
#!/usr/bin/env bash
all_args1="$@"
all_args2="$(printf "%q " "$@")"
# Simulate parsing the input args here
# - see:
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
样本运行并输出:
$ ./backup_all_input_args.sh arg1 "arg 2" "arg 3" arg 3 arg1 arg 2 arg 3 arg1 arg\ 2 arg\ 3
我的第一个方法是用 all_args1="$@"
来支持论点。这失败了,因为我丢失了引号并得到 arg1 arg 2 arg 3
。我的第二种方法是用 all_args2="$(printf "%q " "$@")"
来支持论点。这失败了,因为我再次丢失了引号,而且恰好第一个参数不需要像文件路径一样与反斜杠粘在一起,而是一个 正则表达式 参数,所以它需要真正保持不变。因此,这不等于原始输入:arg1 arg\ 2 arg\ 3
.
我已经研究过的参考文献
- How to keep quotes in Bash arguments?
- How can I preserve quotes in printing a bash script's arguments
- How do I parse command line arguments in Bash?
Bash 演示
更新:这个问答,现在我有了答案,对我刚刚写的这些 bash 演示做出了贡献:
- back_up_all_input_args.sh
- array_practice.sh
- ...最终 this rapid find-and-replace tool wrapper 我写了关于 Ripgrep 的文章。
添加括号并将它们存储在数组中。这会将每个参数保留为单独的单词,并避免所有反斜杠转义的复杂性。
all_args=("$@")
然后您可以将参数传递给另一个命令:
cmd "${all_args[@]}"
或打印出来:
printf '[%s]\n' "${all_args[@]}"
或者将它们分配给另一个数组:
args_copy=("${all_args[@]}")
也可以使用set
还原脚本原</code>、<code>
等,参数:
set -- "${all_args[@]}"