Сценарий BASH: n-й параметр $@, когда индекс является переменной?

Я хочу получить n-й параметр $@ (список параметров командной строки, переданных сценарию), где n хранится в переменной.

Я попробовал ${$n}.

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

./my_script.sh alpha beta gamma

И индекс не должен быть явным, а храниться в переменной n.

Исходный код:

n=2
echo ${$n}

Я ожидал, что вывод будет «бета», но я получаю сообщение об ошибке:

./my_script.sh: line 2: ${$n}: bad substitution

Что я делаю не так?


person Community    schedule 25.05.2012    source источник
comment
Это дубликат. Тот же вопрос здесь: stackoverflow.com/questions/1497811/   -  person Daniel Dinnyes    schedule 25.05.2012


Ответы (5)


Попробуй это:

#!/bin/bash
args=("$@")
echo ${args[1]}

хорошо, замени "1" на $n или что-то в этом роде...

person konqi    schedule 25.05.2012

Вы можете использовать переменную косвенность. Он не зависит от массивов и отлично работает в вашем примере:

n=2
echo "${!n}"

Правка. Косвенная переменная может использоваться во многих ситуациях. Если есть переменная foobar, то следующие два раскрытия переменных дают один и тот же результат:

$foobar

name=foobar
${!name}
person nosid    schedule 25.05.2012
comment
Спасибо. Я уверен, что это тоже работает, но я не понимаю, почему. Почему ничего общего с массивами?! Разве $@ не является списком (не массивом)? - person ; 25.05.2012
comment
@gojira Я думаю, что смысл nosid заключается в том, что вам даже не нужно копировать список аргументов отдельно, и вы можете просто ссылаться на него, используя косвенную переменную - person Andreas Wong; 25.05.2012
comment
@gojira: $@ похож на массив. Выражение ${!n} в этом ответе интерпретируется как $2, когда n равно 2. - person Dennis Williamson; 25.05.2012

Также работает следующее:

#!/bin/bash
n=2
echo ${@:$n:1}
person Smi    schedule 25.05.2012
comment
Знак доллара перед буквой n можно опустить. - person Dennis Williamson; 25.05.2012

Портативное (не специфичное для bash) решение

$ set a b c d
$ n=2
$ eval echo \${$n}
b
person Jens    schedule 25.05.2012
comment
@gojira: Вы должны знать о последствиях безопасности. - person Dennis Williamson; 25.05.2012

eval может помочь вам получить непрямой доступ к переменной, что означает двойное вычисление выражения.

Вы можете сделать так eval alph=\$$n; echo $alph

person Summer_More_More_Tea    schedule 25.05.2012