Сохранить аргументы 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 заменяется решением) и echo
s включены
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[@]}"
Используя "индекс" @
имеет аналогичный эффект "$@"
(вы также можете использовать *
соединять элементы вместе, как "$*"
).