如何在bash中创建和使用所有输入参数("$@")的备份副本? [英] How can I create and use a backup copy of all input args ("$@") in bash?

查看:34
本文介绍了如何在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: 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

示例运行和输出:

$ ./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

我已经研究过的参考资料才走到这一步

  1. How to keep quotes in Bash arguments?
  2. How can I preserve quotes in printing a bash script's arguments
  3. How do I parse command line arguments in Bash?

Bash演示

更新:这个问答,现在我有了答案,促成了我刚才写的这些bash演示:

  1. back_up_all_input_args.sh
  2. array_practice.sh
  3. .,并以this rapid find-and-replace tool wrapper我围绕Ripgrep写的文章结尾。

推荐答案

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

all_args=("$@")

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

cmd "${all_args[@]}"

或打印出来:

printf '[%s]
' "${all_args[@]}"

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

args_copy=("${all_args[@]}")

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

set -- "${all_args[@]}"

这篇关于如何在bash中创建和使用所有输入参数("$@")的备份副本?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆