2012-03-15 8 views
32

Я хочу объявить переменную, имя которой происходит от значения другой переменной, и я написал следующий фрагмент кода:Как использовать значение переменной как имя другой переменной в Баш

a="bbb" 
$a="ccc" 

но это не сработало. Каков правильный способ выполнить эту работу?

ответ

-2

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

#!/usr/bin/bash 

#variable one 
a="one" 

echo "Variable a is $a" 
#variable two with a's variable 
b="$a" 

echo "Variable b is $b" 

#change a 
a="two" 
echo "Variable a is $a" 
echo "Variable b is $b" 

Выход, который это:

Variable a is one 
Variable b is one 
Variable a is two 
Variable b is one 

Так что обязательно назначьте его так: b = "$ a", и вы должны быть хорошими.

+0

Вопрос заключается в том, как непрямое на вычисленных имен переменных, теперь, как назначить выражений фиксированных переменных. – Kaz

9

Для этого вы можете использовать eval.
Пример:

$ a="bbb" 
$ eval $a="ccc" 
$ echo $bbb 
ccc 

Надеется, что это помогает!

41

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

name_of_variable=abc 

eval $name_of_variable="simpleword" # abc set to simpleword 

Это ломает:

eval $name_of_variable="word splitting occurs" 

Исправление:

eval $name_of_variable="\"word splitting occurs\"" # not anymore 

Конечной исправить: поместите текст, который вы хотите назначить в переменную. Назовем это safevariable. Тогда вы можете сделать это:

eval $name_of_variable=\$safevariable # note escaped dollar sign 

Сбрасывание знака доллара разрешает все проблемы с выходом. Знак доллара выживает дословный в функцию eval, которая будет эффективно выполнять это:

eval 'abc=$safevariable' # dollar sign now comes to life inside eval! 

И, конечно, это назначение подверженное всем. safevariable может содержать *, пробелы, $ и т.д. (Протест в том, что мы предполагаем, что name_of_variable не содержит ничего, кроме действительного имени переменной, и один мы свободны использовать:. Не что-то особенное)

12

Это может работать для вы:

foo=bar 
declare $foo=baz 
echo $bar 
baz 

или это:

foo=bar 
read $foo <<<"baz" 
echo $bar 
baz 
+0

Правильно, лучше использовать declare over eval (соображения безопасности) –

+0

@ meso_2600 Объявление не ведет себя так же, как присвоение, поскольку оно изменит область действия переменной на локальную (вы не сможете изменить переменную из родительской области с объявлением, если вы не объявите ее как глобальную переменную). – niieani

+0

Ваш второй ответ велик. ни одна подселочка не была создана. веселит. –

3

Если вы хотите, чтобы получить значение переменной вместо того, чтобы установить его вы можете сделать это

var_name1="var_name2" 
var_name2=value_you_want 
eval temp_var=\$$var_name1 
echo "$temp_var" 

Вы можете прочитать об этом здесь indirect references.

25

Вы можете использовать declare и !, как это:

John="nice guy" 
programmer=John 
echo ${!programmer} # echos nice guy 

Второй пример:

programmer=Ines 
declare $programmer="nice gal" 
echo $Ines # echos nice gal 
+0

Привет, Флимм. Возможно ли это с массивами? Что-то вроде 'echo '$ {! Array [1]}" '? – leaf

Смежные вопросы