Сохранить аргументы Bash-скрипта $@ в переменной

Как я могу хранить $@ в переменной при сохранении ее свойств?

Я хочу получить точно такое же поведение, даже если я использую $@ или моя собственная переменная во всех возможных ситуациях.

Попытки ниже не сработали:

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 заменяется решением) и 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]

2 ответа

Вы можете сохранить его в массиве:

args=("$@")

тогда вы можете получить доступ к каждому из аргументов с индексом: "${args[index]}" и все аргументы сразу с "${args[@]}",

Это зависит от того, что вы хотите сделать. С помощью $@ разделяет аргументы командной строки, если вы хотите объединить их в одну строку, используйте $* вместо. Например:

args="$*"
java A $args

когда "$*" затем аргументы командной строки объединяются в одну строку, используя первый символ IFS как "клей" между каждым аргументом. По умолчанию это пробел. Единственная проблема с этим, если какой-либо из аргументов сам содержит пробел. Если вы знаете, что будут использоваться пробелы, а не вкладки, то вы можете возиться с IFS:

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

IFS="$oldIFS"

Изменить: так как вы хотите сохранить их отдельно, используйте массив:

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

Используя "индекс" @ имеет аналогичный эффект "$@" (вы также можете использовать * соединять элементы вместе, как "$*").

Другие вопросы по тегам