在函数中创建的动态变量在将来的调用中不可用

时间:2018-03-22 01:35:19

标签: bash

我有一个脚本(应该是)将动态变量名称(s1,s2,s3,...)分配给目录路径:

savedir() {
    declare -i n=1
    sn=s$n
    while test "${!sn}" != ""; do
        n=$n+1
        sn=s$n
    done
    declare $sn=$PWD
    echo "SAVED ($sn): ${!sn}"
}

这个想法是用户在他们想要稍后回忆的目录中,并且可以通过键入“已保存的”来将其保存到shell变量中。它实际上成功地写出了echo语句:如果我在目录/ home / mrjones中并键入' savedir',脚本将返回:     SAVED(s1):/ home / mrjones

...我可以进一步输入:

  

echo $ sn

并返回脚本:     S1

...但是输入......

> echo $s1

......或

  

echo $ {!sn}

...两者都不返回(空字符串)。如果不明显的话,我想要的是:

  

echo $ s1

/home/mrjones

非常感谢任何帮助! [为格式化道歉...]

2 个答案:

答案 0 :(得分:1)

要使用存储在另一个变量中的名称设置变量,我使用printf -v,在此示例中:

printf -v "$sn" '%s' "$PWD"

declare这里是为函数创建一个局部变量,它似乎不是你想要的。引自help declare

  

在函数中使用时,declare会使NAME成为本地名称,与local一样       命令。 -g选项会抑制此行为。

因此您可以尝试使用-g或使用printf

答案 1 :(得分:1)

改为使用数组。

savedir() {
    s+=("$PWD")
    echo "SAVED (s[$((${#s[@]}-1))]): ${s[${#s[@]}-1]}"
}