2014-02-03 3 views
1

Надеюсь, я смогу прояснить ситуацию. Я хотел бы создать имя файла из разных строк в bash. Например, hmd.sh, так h, m, d - разные значения (номер 0..9 или буква aA..zZ). Так, например, я хочу, чтобы преобразоватьКак использовать значение строки в bash как имя переменной

h=1 m=11 and d=12 to 1aA.sh. h=> 1, m=>a and d=>A 

Чтобы объявить переменные, как

a01=1; a02=2 .. a09=9, a10=0; a11=a; a12=b and so on. h(1)=a01=1 m(11)=a11=a 

и

d(12)=a12=A. 

Чтобы проверить это, я написал:

#!/bin/bash 
dd01="1" 
aa="01" 
bb="dd$aa" 
echo $bb 

Но, конечно, $bb - dd01, а не его значение. Как я могу сделать $bb его значение 1?

ответ

-3

Оператор $ $ можно использовать для доступа к значению переменной. Например ...

d = 'Hi' 
e = ' there ' 
f = 'friend.' 
foo = '$d$e$f' 

Это приведет к тому, что значение foo будет «Привет, друг».

Надеюсь, это поможет.

+0

Я думаю, что он хочет, является косвенной ссылкой на переменную; то есть он хочет интерпретировать значение переменной как имя другой переменной, а затем получить последнее значение. – TypeIA

+0

Это даже не синтаксически правильный код оболочки. –

-4

Use eval:

#!/bin/bash 
dd01="1" 
aa="01" 
eval bb=\$dd$aa 
echo $bb 

Этот скрипт выводит ожидаемый 1.

+0

Downvoter, пожалуйста, прокомментируйте? – TypeIA

4

Ассоциативные массивы делают такие вещи более читабельными.

Однако ваш ответ «переменная окольный»

$ echo $bb 
dd01 
$ echo ${!bb} 
1 

Не слушайте никаких советов предлагая eval - вы открываете себя для всех видов инъекций коды.

-1

Это должно сделать работу:

#!/bin/bash 
dd01="1" 
aa="01" 
bb="dd$aa" 
eval echo \$$bb 
0

Я переписал ваш пример кода следующим образом, который дает значение 1, которое является то, что вы пытаетесь достичь.

#!/bin/bash 
dd01="1" 
aa="01" 
bb="dd$aa" 
echo $[$bb] 
+1

Арифметическая оценка будет работать, за исключением случаев, когда «dd01» не является числом –

+0

Я думаю, что попробую ваше решение. Я действительно хочу иметь значение dd01 = (1). В исходном коде это будет строка, а не значение. Так что 01 вместо 1. Спасибо всем за помощь. Это поможет мне дальше в хорошем направлении. – Helfenstein

+0

Это отлично работает! – Helfenstein

1

Единственный способ расширить переменную внутри другого в массиве, когда переменная заключена в скобки этого ключа как [$var].

Вы можете хранить значения в ассоциативном массиве, и ссылаться на них, как так:

declare -A arr 
arr[dd01]="1" 
arr[aa]="01" 
arr[bb]="dd${arr[aa]}" 
echo ${arr[${arr[bb]}]} 

Используя массивы, как это может быть более запутанным для этого примера, чем ссылки на имя переменной, используя ${!bb} синтаксис, но если вы необходимо сделать это, сохраняя разные наборы переменных, которые могут потребоваться для ссылки друг на друга, создание ассоциативного массива может иметь более организационный смысл.

+0

Хотя '$$' является специальным параметром, он не полностью объясняет, почему '$ {$ foo}' не сможет расшириться до значения переменной с именем '$ foo'. – chepner

+0

Исправить. '$$' встроенная переменная вызывала ошибку только при попытке расширить переменную без использования фигурных скобок. См. Обновленный пост. –

+1

Это очень запутанный способ избежать синтаксиса косвенного расширения параметров. – chepner

0

Это сделал трюк:

#!/bin/bash 
dd=1234567890aAbBcC 
aa="11" 
echo ${dd:(aa-1):1} 

Appearantly 1 является 0 позиции и а также может быть как 01 и до сих пор работает!

Благодарим за все советы.

Я нашел ответ здесь:

http://tldp.org/LDP/abs/html/string-manipulation.html

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