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

时间:2015-05-25 11:03:40

标签: bash parameter-passing args

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

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

以下尝试无效:

args=$@
args2="$@"        # the arguments are combined (see the last output paragraph)

我使用以下行测试它们:

s.sh A B="       " C

s.sh

#!/bin/bash

args=$@
args2="$@"
#args3 = ? - TODO

echo $args
echo $args2
echo $@
#echo $args3   

echo

echo "$args"
echo "$args2"
echo "$@"
#echo "$args3"

echo

java A $args
java A $args2
java A $@
#java A $args3

echo

java A "$args"
java A "$args2"
java A "$@"
#java A "$args3"

A.java

import java.util.Arrays;

public class A {
    public static void main(String args[]){
        System.out.println(args.length + ": " + Arrays.asList(args));
    }
}

实际输出:

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]

预期输出(如果TODO被解决方案替换)并启用echo

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]

2 个答案:

答案 0 :(得分:4)

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

args=("$@")

然后您可以使用索引"${args[index]}"访问每个参数,并使用"${args[@]}"一次访问所有参数。

答案 1 :(得分:3)

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

args="$*"
java A $args

当使用"$*"时,命令行参数使用IFS的第一个字符作为" glue"加入到一个字符串中。每个论点之间。默认情况下,这是一个空格。唯一的问题是,如果任何参数本身包含空格。如果您知道将使用空格而不是制表符,那么您可能会混淆IFS

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

IFS="$oldIFS"

编辑:因为你希望将它们分开,然后使用数组:

args=("$@")
java A "${args[@]}"

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