Bash 在函数中创建的动态变量在以后的调用中不可用

Bash 在函数中创建的动态变量在以后的调用中不可用,bash,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}" } 其思想是,用户位于他们希望稍后调用的目录中,可以通过键入“savedir”

我有一个脚本,它(应该)将一个动态变量名(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}"
}
其思想是,用户位于他们希望稍后调用的目录中,可以通过键入“savedir”将其保存到shell变量中。事实上,它成功地写出了echo语句:如果我在/home/mrjones目录中并键入“savedir”,脚本将返回: 已保存(s1):/home/mrjones

…我可以进一步键入:

回音$sn

脚本返回: s1

…但键入或

> echo $s1
…或

echo${!sn}

…两者都不返回任何内容(空字符串)。如果不明显,我想要的是:

echo$s1


非常感谢您的帮助![抱歉格式化…][/p>要使用另一个变量中存储的名称设置变量,我使用
printf-v
,在本例中:

printf -v "$sn" '%s' "$PWD"
declare
这里创建的是函数的局部变量,它似乎不是您想要的。从
帮助声明中引用

在函数中使用时,
declare
使名称成为本地名称,就像
local
指挥部。
-g
选项禁止此行为


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

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

printf -v "$sn" '%s' "$PWD"
declare
这里创建的是函数的局部变量,它似乎不是您想要的。从
帮助声明中引用

在函数中使用时,
declare
使名称成为本地名称,就像
local
指挥部。
-g
选项禁止此行为

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

使用数组

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

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

忘了提到我也尝试了:export$sn…和:export$sn=${!sn}您知道
bash
中的目录堆栈吗
DIRSTACK
已存在;只需使用
pushd
而不是
cd
来填充它。谢谢@chepner-我知道这个堆栈,但我不确定它是否有用。我需要能够在bash命令(例如mv、cp等)中引用目录。对于ex.mv$s1/somefile.txt$s3/。但我可能并没有完全理解DIRSTACK的用途——我会看看。再次感谢!即使您只是想要一个任意目录名的列表,也要使用数组而不是动态变量。忘记提到我也尝试过:export$sn…和:export$sn=${!sn}您知道
bash
中的目录堆栈吗
DIRSTACK
已存在;只需使用
pushd
而不是
cd
来填充它。谢谢@chepner-我知道这个堆栈,但我不确定它是否有用。我需要能够在bash命令(例如mv、cp等)中引用目录。对于ex.mv$s1/somefile.txt$s3/。但我可能并没有完全理解DIRSTACK的用途——我会看看。再次感谢!即使您只需要一个任意目录名的列表,也可以使用数组而不是动态变量。太棒了——我使用了declare-g选项——这非常有效!非常感谢。太棒了——我使用了declare-g选项——这非常有效!非常感谢。哦,我的。。。这很深。谢谢@chepner-我一定会尝试一下!如果只定义
n=$(${s[@]}-1))
第一行,那么第二行就不那么难看了。然后就是
echo“已保存(s[$n]):${s[n]}”
。哦,我的天。。。这很深。谢谢@chepner-我一定会尝试一下!如果只定义
n=$(${s[@]}-1))
第一行,那么第二行就不那么难看了。然后它只是
echo“保存(s[$n]):${s[n]}”