我的 bash 脚本如下所示:
#!/bin/bash
set -x
./test FLAGS=${@:2}
当我运行时./script 1 2 3
执行的命令是./test FLAGS=2 3
.我想FLAGS="2 3"
。
当我将第四行更改为 时,./test FLAGS="${@:2}"
没有任何变化。
当我将第四行更改为时,./test FLAGS=\"{@:2}\"
我得到的./test 'FLAGS="2' '3"'
确实不是我想要的。
如何简单地将变量括在引号中?
答案1
使用
"${*:2}"
代替
"${@:2}"
$@
、 和${x[@]}
以及它们的变体,数组中每个元素扩展为一个“字”当被引用时。$*
(和${x[*]}
)将所有元素连接在一起扩展为单个单词使用 的第一个字符$IFS
。
答案2
根据评论,我的理解是您想要丢弃(或存储在某处)第一个参数,然后使用其余参数作为您从脚本中调用的另一个脚本或命令的参数。
如果是这样,您可以很容易地做到这一点,并且不需要设置变量(FLAGS
或其他任何东西)来将脚本的参数传递给脚本中的命令。请参见以下示例:
#!/bin/bash
set -x
original_first_arg="$1" # Use this line if you need to save the value to use later.
shift
mycommand "$@"
该shift
命令是bash
内置命令。就其本身而言(不给它任何数字),它只是丢弃脚本的第一个参数(位置参数)。从联机帮助页:
shift [n]
The positional parameters from n+1 ... are renamed to $1 ....
Parameters represented by the numbers $# down to $#-n+1 are
unset. n must be a non-negative number less than or equal to
$#. If n is 0, no parameters are changed. If n is not given,
it is assumed to be 1. If n is greater than $#, the positional
parameters are not changed. The return status is greater than
zero if n is greater than $# or less than zero; otherwise 0.
然后"$@"
扩展到您为脚本提供的确切参数,减去第一个参数,$1
因为该参数已被命令丢弃shift
。
进一步阅读:
答案3
如果您想要根据脚本的参数使用不同的参数集,那么您能为此使用函数:
other_script(){ shift; command other_script "$@"; }
other_script "$@"
我通常就是这样做的。一个函数可以调用另一个函数,或者它本身,或者定义一个新函数——或者重新定义它自己。每个函数都有一个数组。