如何将变量扩展括在引号中?

如何将变量扩展括在引号中?

我的 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

如果根本没有引用它们,则两个版本都会经过分词并在任何字符处创建多个单词分割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 "$@"

我通常就是这样做的。一个函数可以调用另一个函数,或者它本身,或者定义一个新函数——或者重新定义它自己。每个函数都有一个数组。

相关内容