Как создать переменную из вывода другого в Bash - PullRequest
0 голосов
/ 18 августа 2011

Вот пример сценария, который не работает так, как я ожидаю:

#!/bin/bash
for dynamic in a b c; do
  myvar=$dynamic

  export $myvar="hi"

  echo $(eval "$myvar")
  echo $dynamic
done

Я хочу, чтобы результат был:

hi

a

hi

b

hi

c

Есть идеи? Я готов отказаться от этого метода, но я определенно хочу иметь возможность создавать переменную с именем из выходных данных алгоритма. В данном случае это просто цикл for.

Ответы [ 3 ]

6 голосов
/ 18 августа 2011

eval имеет тенденцию вызывать ошибки, поэтому по возможности избегайте их; в этом случае гораздо чище использовать косвенное расширение с ${!metavariable}:

#!/bin/bash
for dynamic in a b c; do
  myvar=$dynamic

  export $myvar="hi"

  echo ${!myvar}
  echo $dynamic
done
2 голосов
/ 18 августа 2011

Ниже приведено исправление для вашей программы.Есть две вещи, которые вы ошиблись: во-первых, вам не нужно '$' при объявлении переменных.Во-вторых, вызов eval будет обрабатывать содержимое myvar как сценарий оболочки.Однако вы нигде не определили «привет» как команду.

 for dynamic in a b c; do
     myvar=$dynamic

-    export $myvar="hi"
+    export myvar="hi"

-    echo $(eval "$myvar")
+    echo "$myvar"
     echo $dynamic
 done
0 голосов
/ 18 августа 2011

Не совсем понятно, что это то, что вы ищете, но я думаю, что вы хотите что-то вроде:

#!/bin/sh

a=A
b=B
c=C
for i in a b c; do
        eval $i=value_$i
        eval echo \$$i
done
echo $a  # Prints "value_a"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...