Shell(Bash) - 变量间接引用

假设一个变量的值是第二个变量的名字. 那么我们如何从第一个变量中取得第二个变量的值呢? 比如, 如果a=letter_of_alphabet并且letter_of_alphabet=z, 那么我们能够通过引用变量a来获得z么? 这确实是可以做到的, 它被称为间接引用. 它使用eval var1=$$var2这种不平常的形式.


1 #!/bin/bash
2 # ind-ref.sh: 间接变量引用.
3 # 访问一个以另一个变量内容作为名字的变量的值.(译者注: 怎么译都不顺)
4
5 a=letter_of_alphabet   # 变量"a"的值是另一个变量的名字.
6 letter_of_alphabet=z
7
8 echo
9
10 # 直接引用.
11 echo "a = $a"          # a = letter_of_alphabet
12
13 # 间接引用.
14 eval a=$$a
15 echo "Now a = $a"      # 现在 a = z
16
17 echo
18
19
20 # 现在, 让我们试试修改第二个引用的值.
21
22 t=table_cell_3
23 table_cell_3=24
24 echo ""table_cell_3" = $table_cell_3"            # "table_cell_3" = 24
25 echo -n "dereferenced "t" = "; eval echo $$t    # 解引用 "t" = 24
26 # 在这个简单的例子中, 下面的表达式也能正常工作么(为什么?).
27 #         eval t=$$t; echo ""t" = $t"
28
29 echo
30
31 t=table_cell_3
32 NEW_VAL=387
33 table_cell_3=$NEW_VAL
34 echo "Changing value of "table_cell_3" to $NEW_VAL."
35 echo ""table_cell_3" now $table_cell_3"
36 echo -n "dereferenced "t" now "; eval echo $$t
37 # "eval" 带有两个参数 "echo" 和 "$$t" (与$table_cell_3等价)
38
39 echo
40
41 # (感谢, Stephane Chazelas, 澄清了上边语句的行为.)
42
43
44 # 另一个方法是使用${!t}符号, 见"Bash, 版本2"小节的讨论.
45 # 也请参考 ex78.sh.
46
47 exit 0



1 #!/bin/bash
  2 # resistor-inventory.sh
  3 # 使用间接变量引用的简单数据库应用.
  4
  5 # ============================================================== #
  6 # 数据
  7
  8 B1723_value=470                                   # 欧姆
  9 B1723_powerdissip=.25                             # 瓦特
10 B1723_colorcode="yellow-violet-brown"             # 颜色
11 B1723_loc=173                                     # 位置
12 B1723_inventory=78                                # 数量
13
14 B1724_value=1000
15 B1724_powerdissip=.25
16 B1724_colorcode="brown-black-red"
17 B1724_loc=24N
18 B1724_inventory=243
19
20 B1725_value=10000
21 B1725_powerdissip=.25
22 B1725_colorcode="brown-black-orange"
23 B1725_loc=24N
24 B1725_inventory=89
25
26 # ============================================================== #
27
28
29 echo
30
31 PS3='Enter catalog number: '
32
33 echo
34
35 select catalog_number in "B1723" "B1724" "B1725"
36 do
37   Inv=${catalog_number}_inventory
38   Val=${catalog_number}_value
39   Pdissip=${catalog_number}_powerdissip
40   Loc=${catalog_number}_loc
41   Ccode=${catalog_number}_colorcode
42
43   echo
44   echo "Catalog number $catalog_number:"
45   echo "There are ${!Inv} of [${!Val} ohm / ${!Pdissip} watt] resistors in stock."
46   echo "These are located in bin # ${!Loc}."
47   echo "Their color code is "${!Ccode}"."
48
49   break
50 done
51
52 echo; echo
53
54 # 练习:
55 # -----
56 # 1) 重写脚本, 使其从外部文件读取数据.
57 # 2) 重写脚本,
58 #+   用数组来代替间接变量引用,
59 #    因为使用数组更简单, 更易懂.
60
61
62 # 注:
63 # ---
64 #  除了最简单的数据库应用, 事实上, Shell脚本本身并不适合于数据库应用.
65 #+ 因为它太依赖于工作环境和机器的运算能力.
66 #  更好的办法还是使用支持数据结构的本地语言,
67 #+ 比如C++或者Java(或者甚至可以是Perl).
68
69 exit 0

【转载 http://www.linux.gov.cn/shell/absguide/html/bashver2.html#RESISTOR】   
  

你可能感兴趣的:(Linux,Scripts)