расширение команды bash - PullRequest
       9

расширение команды bash

0 голосов
/ 11 сентября 2011

Следующая подстановка команд bash не работает, как я думал.

echo $TMUX_$(echo 1)

выводит только 1, и я ожидаю значение переменной $TMUX_1. Я также пытался:

echo ${TMUX_$(echo 1)}
-bash: ${TMUXPWD_$(echo 1)}: bad substitution

Есть предложения?

Ответы [ 3 ]

1 голос
/ 11 сентября 2011

Если я правильно понимаю, что вы ищете, вы пытаетесь программно построить имя переменной и затем получить доступ к значению этой переменной. Для этого обычно требуется оператор eval:

eval "echo \$TMUX_$(echo 1)"

Важные особенности этого оператора включают использование двойных кавычек, так что $( ) правильно интерпретируется как подстановка команды, и экранирование первого $, чтобы он не оценивался в первый раз через. Еще один способ добиться того же -

eval 'echo $TMUX_'"$(echo 1)"

, где в этом случае я использовал две строки, которые автоматически объединяются. Первая заключена в одинарные кавычки, поэтому сначала она не оценивается.

Существует одно исключение из требования eval: в Bash есть метод косвенной ссылки, ${!name}, для случаев, когда вы хотите использовать содержимое переменной в качестве имени переменной. Вы можете использовать это следующим образом:

tmux_var = "TMUX_$(echo 1)"
echo ${!tmux_var}

Я не уверен, есть ли способ сделать это в одном выражении, так как для этого нужно иметь именованную переменную.

P.S. Я предполагаю, что echo 1 - это просто замена для более сложной команды; -)

0 голосов
/ 11 сентября 2011

Это работает (проверено):

eval echo \$TMUX_`echo 1`

Вероятно, не очень ясно, хотя.Уверен, что для любого решения потребуется обратная связь вокруг эха, чтобы это работало.

0 голосов
/ 11 сентября 2011

Вы ищете массивы? У Баш их есть. Существует несколько способов создания и использования массивов в bash, настоятельно рекомендуется использовать раздел справочной страницы bash по массивам. Вот пример кода:

TMUX=( "zero", "one", "two" )
echo ${TMUX[2]}

Результат в этом случае, конечно, два.

Вот несколько коротких строк из man-страницы bash:

   Bash provides one-dimensional indexed and associative array variables.  Any variable may be
   used  as  an indexed array; the declare builtin will explicitly declare an array.  There is
   no maximum limit on the size of an array, nor any requirement that members  be  indexed  or
   assigned  contiguously.  Indexed arrays are referenced using integers (including arithmetic
   expressions)  and  are  zero-based;  associative  arrays  are  referenced  using  arbitrary
   strings.

   An  indexed  array is created automatically if any variable is assigned to using the syntax
   name[subscript]=value.  The subscript is treated as  an  arithmetic  expression  that  must
   evaluate  to  a  number  greater  than  or equal to zero.  To explicitly declare an indexed
   array, use declare -a name (see SHELL BUILTIN COMMANDS below).  declare -a  name[subscript]
   is also accepted; the subscript is ignored.
...