我试图将“嵌套”变量的值获取到另一个变量中和/或直接使用该值,如下所示
下面是一个示例场景,它准确地解释了我陷入困境的地方
$ USER1_DIR=./user1/stuff
$ USER2_DIR=./user2/stuff
$ USER3_DIR=./user3/stuff
#User will be taken as input, for now assuming user is USER1
$ USER="USER1"
$ DIR=${USER}_DIR
$ echo $DIR
>> USER1_DIR
$ DIR=${${USER}_DIR}
>> -bash: ${${USER}_DIR}: bad substitution
Run Code Online (Sandbox Code Playgroud)
挑战一:
当输入为 USER1 时,获取 ./user1/stuff 的 DIR 值
或者
当输入为 USER1 时,获取 ./user1/stuff 作为输出
在完成挑战 1 后,我必须向用户目录中的文件添加一些内容,如下所示
期望的输出如下
$ echo "Some stuff of user1" >> $DIR/${DOC}$NO
# Lets say DOC="DOC1" and NO="-346"
# So the content has to be added to ./user1/stuff/DOC1-346
# Assume that all Directories exists
Run Code Online (Sandbox Code Playgroud)
仅供参考,上述代码将成为 bash 脚本中函数的一部分,并且仅在 Linux 服务器上执行。
注意:我不知道如何称呼变量 DIR,因此使用术语“嵌套”变量。很高兴知道它叫什么,非常感谢任何见解。:)
您可以使用eval变量间接 ${!...}或引用变量 declare -n。
在下文中,我将使用小写变量名称,因为按照惯例,大写变量名称很特殊。尤其是覆盖$USER是不好的,因为该变量通常包含您的用户名(没有显式设置它)。对于以下代码片段,假设以下变量:
user1_dir=./user1/stuff
user=user1
Run Code Online (Sandbox Code Playgroud)
eval "echo \${${user}_dir}"
# prints `./user1/stuff`
Run Code Online (Sandbox Code Playgroud)
Eval 是 bash 内置函数,它执行其参数,就好像它们是在 bash 本身中输入的一样。这里,eval是用参数 来调用的echo "${user1_dir}"。
使用eval被认为是不好的做法,请参阅这个问题。
当将变量的名称存储var1在另一个变量中时var2,可以使用间接寻址${!var2}来获取变量的值var1。
userdir="${user}_dir"
echo "${!userdir}"
# prints `./user1/stuff`
Run Code Online (Sandbox Code Playgroud)
您还可以在 bash 中声明一个引用变量,而不是每次都使用间接寻址:
declare -n myref="${user}_dir"
Run Code Online (Sandbox Code Playgroud)
引用的使用方式与变量间接寻址类似,但无需编写!.
echo "$myref"
# prints `./user1/stuff`
Run Code Online (Sandbox Code Playgroud)
使用(关联)数组时,您的脚本可能会变得更容易。数组是存储多个值的变量。可以使用索引来访问单个值。普通数组使用自然数作为索引。关联数组使用任意字符串作为索引。
# Create an array with three entries
myarray=(./user1/stuff ./user2/stuff ./user3/stuff)
# Get the first entry
echo "${myarray[0]}"
# Get the *n*-th entry
n=2
echo "${myarray[$n]}"
Run Code Online (Sandbox Code Playgroud)
声明一个包含三个条目的关联数组
# Create an associative array with three entries
declare -A myarray
myarray[user1]=./user1/stuff
myarray[user2]=./user2/stuff
myarray[user3]=./user3/stuff
# Get a fixed entry
echo "${myarray[user1]}"
# Get a variable entry
user=user1
echo "${myarray[$user]}"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3185 次 |
| 最近记录: |