将 Bash 脚本参数 $@ 存储在变量中

ROM*_*eer 3 bash parameter-passing args

如何$@在保持其属性的同时存储在变量中?

即使我$@在所有可能的情况下使用或我自己的变量,我也想获得完全相同的行为。

以下尝试无效:

args=$@
args2="$@"        # the arguments are combined (see the last output paragraph)
Run Code Online (Sandbox Code Playgroud)

我使用以下行测试了它们:

s.sh A B="       " C
Run Code Online (Sandbox Code Playgroud)

s.sh

args=$@
args2="$@"        # the arguments are combined (see the last output paragraph)
Run Code Online (Sandbox Code Playgroud)

A.java

s.sh A B="       " C
Run Code Online (Sandbox Code Playgroud)

实际输出:

A B= C
A B= C
A B= C

A B= C
A B=        C
A B=        C

3: [A, B=, C]
3: [A, B=, C]
3: [A, B=, C]

1: [A B= C]
1: [A B=        C]
3: [A, B=       , C]
Run Code Online (Sandbox Code Playgroud)

预期输出(如果 TODO 被解决方案取代)和echos 已启用

A B= C
A B= C
A B= C
A B= C

A B= C
A B=        C
A B=        C
A B=        C

3: [A, B=, C]
3: [A, B=, C]
3: [A, B=, C]
3: [A, B=, C]

1: [A B= C]
1: [A B=        C]
3: [A, B=       , C]
3: [A, B=       , C]
Run Code Online (Sandbox Code Playgroud)

Jah*_*hid 6

您可以将其存储在数组中:

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

然后您可以使用 index: 访问每个参数,"${args[index]}"并使用"${args[@]}".

  • 访问数组元素时应该使用双引号(例如`"${args[index]}"`)。此外,您可以使用 `"${args[@]}"` 一次性获取所有参数。 (4认同)

cda*_*rke 6

这取决于你想做什么。使用$@可将命令行参数分开,如果您想将它们连接在一起作为单个字符串,请$*改为使用。例如:

args="$*"
java A $args
Run Code Online (Sandbox Code Playgroud)

"$*"使用 时,命令行参数将连接成一个字符串,使用 的第一个字符IFS作为每个参数之间的“粘合剂”。默认情况下这是一个空格。唯一的问题是任何参数本身是否包含空格。如果您知道将使用空格而不是制表符,那么您可以搞乱IFS

oldIFS="$IFS"
IFS=$'\t'
args="$*"
java A.py $args

IFS="$oldIFS"
Run Code Online (Sandbox Code Playgroud)

编辑:因为您希望将它们分开,所以使用数组:

args=("$@")
java A "${args[@]}"
Run Code Online (Sandbox Code Playgroud)

使用 的“索引”@具有类似的效果"$@"(您也可以使用*将元素连接在一起,就像 一样"$*")。