Bash创建变量然后为其赋值

时间:2011-02-03 05:15:32

标签: linux bash scripting

对于这个问题,我有两个值, curdir curlevel ,这会在整个脚本中发生变化。我想知道是否可以创建变量然后使用该值作为另一个值的名称。例如

temp="dir_${curdir}_${curlevel}"
$temp=$name_of_directory  **<----Is there a legitimate way to do this?**

所以如果最初是curdir=1curlevel=0那么 $(temp)=directory_one 等于

dir_1_0=directory_one

然后如果curdir=2curlevel=4,我可以重置temp然后

$(temp)=another_directory

相同
dir_2_4=another_directory

所以我可以拨打电话,例如

cd $(temp)

当我需要

时会将我移动到不同的目录

3 个答案:

答案 0 :(得分:4)

我认为你想要的是使用eval。像这样:

 $ foo=bar
 $ bar=baz
 $ eval qux=\$$foo
 $ echo $qux
 baz

所以你能做的就像是

eval temp=\$$"dir_${curdir}_${curlevel}"
cd $temp

答案 1 :(得分:3)

这方面的诀窍是多次使用eval

curdir=1
curlevel=0
temp='dir_${curdir}_${curlevel}'      # Note single quotes!
x=$(eval echo $temp)
eval $x=$PWD
cd /tmp
curdir=2
curlevel=4
x=$(eval echo $temp)
eval $x=$PWD

echo $dir_1_0
echo $dir_2_4

sh -x script的输出:

+ curdir=1
+ curlevel=0
+ temp='dir_${curdir}_${curlevel}'
++ eval echo 'dir_${curdir}_${curlevel}'
+++ echo dir_1_0
+ x=dir_1_0
+ eval dir_1_0=/Users/jleffler/tmp/soq
++ dir_1_0=/Users/jleffler/tmp/soq
+ cd /tmp
+ curdir=2
+ curlevel=4
++ eval echo 'dir_${curdir}_${curlevel}'
+++ echo dir_2_4
+ x=dir_2_4
+ eval dir_2_4=/tmp
++ dir_2_4=/tmp
+ echo /Users/jleffler/tmp/soq
/Users/jleffler/tmp/soq
+ echo /tmp
/tmp

sh script的输出:

/Users/jleffler/tmp/soq
/tmp

转换为函数:

change_dir()
{
    temp='dir_${curdir}_${curlevel}'      # Note single quotes!
    x=$(eval echo $temp)
    eval $x=$PWD
    cd $1
}

curdir=1
curlevel=0
change_dir /tmp

curdir=2
curlevel=4
change_dir $HOME

echo $dir_1_0
echo $dir_2_4
pwd

输出:

/Users/jleffler/tmp/soq
/tmp
/Users/jleffler

录制的名称是剩下的目录的名称,而不是您到达的名称。

答案 2 :(得分:1)

执行此操作的安全方法是使用indirection, associative arrays (Bash 4), functions or declare

使用declare

declare $temp=$name_of_directory

使用间接:

bar=42
foo=bar
echo ${!foo}
IFS= read -r $foo <<< 101
echo ${!foo}

请注意 security implications of eval