Bash 在函数中创建的动态变量在以后的调用中不可用
我有一个脚本,它(应该)将一个动态变量名(s1、s2、s3,…)分配给一个目录路径: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”
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]}”
。