Bash - 获得'嵌套'的价值变量到另一个变量[编辑:间接变量扩展]

时间:2017-09-23 19:00:40

标签: linux bash sh

我试图获得嵌套'的价值。变量到另一个变量和/或直接使用该值,如下所示

下面是一个示例场景,它准确地解释了我被困的位置

$ 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
  

挑战1:

     

当输入为USER1

时,将DIR值输入./user1/stuff      

     

当输入为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

仅供参考,以上代码将成为bash脚本中函数的一部分,并且只能在Linux服务器上执行。

注意:我不知道将变量DIR称为什么,因此使用了术语“嵌套”#39;变量。知道它叫什么会很棒,非常感谢任何见解。 :)

1 个答案:

答案 0 :(得分:1)

您可以使用eval变量间接 ${!...}参考变量 declare -n

在下文中,我将使用小写变量名,因为大写变量名是按惯例特殊的。特别是覆盖$USER是不好的,因为该变量通常包含您的用户名(没有明确设置它)。

评估

eval 'echo "${'"$user"'_dir}"'

Eval是一个内置的bash,它执行它的参数就好像它们是在bash中输入的一样。这里,使用参数eval调用echo "${user1_dir}"

使用eval被视为不良做法,请参阅this question

变量间接

请参阅Inian's answer

参考变量

您可以在bash中声明一个引用变量,而不是每次都使用间接:

declare -n myref="${user}_dir"

引用可以类似于变量间接使用,但不必编写!

echo "$myref"
./user1/stuff

替代

使用(关联)数组时,您的脚本可能会变得更容易。数组是存储多个值的变量。可以使用索引访问单个值。正常数组使用自然数作为索引。关联数组使用任意字符串作为索引。

(正常)数组

# 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]}"

关联数组

声明一个包含三个条目的关联数组

# 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]}"