对于这个问题,我有两个值, curdir 和 curlevel ,这会在整个脚本中发生变化。我想知道是否可以创建变量然后使用该值作为另一个值的名称。例如
temp="dir_${curdir}_${curlevel}"
$temp=$name_of_directory **<----Is there a legitimate way to do this?**
所以如果最初是curdir=1
和curlevel=0
那么
$(temp)=directory_one
等于
dir_1_0=directory_one
然后如果curdir=2
和curlevel=4
,我可以重置temp然后
$(temp)=another_directory
与
相同dir_2_4=another_directory
所以我可以拨打电话,例如
cd $(temp)
当我需要
时会将我移动到不同的目录答案 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}