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)
您可以将其存储在数组中:
args=("$@")
Run Code Online (Sandbox Code Playgroud)
然后您可以使用 index: 访问每个参数,"${args[index]}"并使用"${args[@]}".
这取决于你想做什么。使用$@可将命令行参数分开,如果您想将它们连接在一起作为单个字符串,请$*改为使用。例如:
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)
使用 的“索引”@具有类似的效果"$@"(您也可以使用*将元素连接在一起,就像 一样"$*")。