如何在bash中使用字符串的值作为变量名

时间:2014-02-03 21:45:04

标签: linux string bash

希望我能说清楚。我想在bash中用不同的字符串创建一个文件名。例如hmd.sh所以hmd是不同的值(数字0..9或字母aA..zZ)。所以例如我想转换

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

但当然$bbdd01而不是它的价值。如何使$bb的值为1?

7 个答案:

答案 0 :(得分:4)

关联数组使这种事物更具可读性。

但是你的回答是“变量间接”

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

不要听取任何暗示eval的建议 - 你可以打开各种代码注入。

答案 1 :(得分:1)

将变量扩展到另一个变量中的唯一方法是在变量包含在[$var]之类的键括号中的数组中。

您可以将值存储在关联数组中,并像这样引用它们:

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

对于此示例使用这样的数组可能比使用${!bb}语法引用变量名称更复杂,但如果您需要在保留可能需要相互引用的不同变量集的同时执行此操作,则创建关联数组可能会更具组织意义。

答案 2 :(得分:0)

我重写了你的代码示例如下,它给你的值为1,这是你想要实现的。

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

答案 3 :(得分:0)

这就是诀窍:

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

外观上1是0位置,aa也可以像01,仍然有效!

感谢所有建议。

我在这里找到了答案:

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

答案 4 :(得分:-1)

这应该做的工作:

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

答案 5 :(得分:-3)

您可以使用'$'运算符来访问变量的值。例如......

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

这会导致foo的值为'Hi there friend。'

希望这有帮助。

答案 6 :(得分:-4)

Use eval

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

此脚本输出预期的1