[email protected]в переменной - программирование" />

Хранить Bash script аргументы [email protected]в переменной

Как сохранить [email protected] в переменной при сохранении ее свойств?

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

Не удалось выполнить следующие попытки:

[email protected]
args2="[email protected]"        # the arguments are combined (see the last output paragraph)

Я тестировал их, используя следующую строку:

s.sh A B="       " C

s.sh

#!/bin/bash

[email protected]
args2="[email protected]"
#args3 = ? - TODO

echo $args
echo $args2
echo [email protected]
#echo $args3   

echo

echo "$args"
echo "$args2"
echo "[email protected]"
#echo "$args3"

echo

java A $args
java A $args2
java A [email protected]
#java A $args3

echo

java A "$args"
java A "$args2"
java A "[email protected]"
#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]

Ответ 1

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

args=("[email protected]")

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

Ответ 2

Это зависит от того, что вы хотите сделать. Использование [email protected] поддерживает разделение аргументов командной строки, если вы хотите объединить их в одну строку, вместо этого используйте $*. Например:

args="$*"
java A $args

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

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

IFS="$oldIFS"

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

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

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