分类: 系统运维
2012-07-28 17:07:19
Bourne Shell中模拟二维数组 (2007-10-12 20:47:02)
标签:
杂谈Bourne Shell是不支持数组的,一般的处理方法如下:
---------------
A="1 2 3 4"
set $A
echo $N
---------------
那么,二维数组数组怎么办?想来想去也没有什么好方法。
只好用如下的形式模拟一下:
---------------
A1="11 12 13"
A2="21 22 23"
A3="31 32 33"
A4="41 42 43"
---------------
对于A(x, y),先找到Ax,然后在其中找到第y个元素。
这里分为读取(get)和设置(set)两种处理:
N=A(x, y) ==> getValue(A, x, y)
A(x, y)=N ==> setValue(A, x, y, N)
1 #!/bin/sh
2
3 # replace(idx, val)
4 replace()
5 {
6 idx=$1; val=$2
7
8 awk " {
9 for(i = 1; i <= NF; i++)
10 printf(\"%d\", i != $idx ? \$i : $val);
11 } "
12
13 }
14
15 # setValue(A, i, j, val)
16 setValue()
17 {
18 A=$1; i=$2; j=$3; val=$4
19
20 eval p=\$$A$i
21 eval $A$i=\"`echo $p | replace $j $val`\"
22 }
23
24 # getValue(A, i, j)
25 getValue()
26 {
27 A=$1; i=$2; j=$3
28
29 eval echo \$$A$i | awk "{print \$$j}"
30 }
31
32 #===============#
33 # Test routines #
34 #===============#
35 SDV1="11 12 13"
36 SDV2="21 22 23"
37 SDV3="31 32 33"
38 SDV4="41 42 43"
39
40 printArray()
41 {
42 echo "[$SDV1]"
43 echo "[$SDV2]"
44 echo "[$SDV3]"
45 echo "[$SDV4]"
46 }
47
48 test_setValue()
49 {
50 for i in 1 2 3 4; do
51 for j in 1 2 3; do
52 setValue SDV $i $j 999
53 echo "SDV($i, $j) => 999"
54 done
55 done
56 printArray
57 }
58
59 test_getValue()
60 {
61 printArray
62 for i in 1 2 3 4; do
63 for j in 1 2 3; do
64 n=`getValue SDV $i $j`
65 echo "SDV($i, $j) = $n"
66 done
67 done
68 }
69
70 main()
71 {
72 echo BEFORE
73 test_getValue
74
75 echo SETTING
76 test_setValue
77
78 echo AFTER
79 test_getValue
80 }
81
82 main
b=1
a1=10
echo ${a$b} #php 可以这样用,shell不可以噢!!
echo `eval 'echo $'a$b`
eval echo \${a$b}
#!/bin/sh
i=0
for((;i<12;i=$i+2))
{
echo "=$i/n"
re="ab$i"
echo "$re"
echo "//$re/n"
}
~
~
它相当于 c 语言中的宏定义,当在一个赋值语句的前面加上 eval 时,它就会将 后面表达式中以 $ 开头的所有变量进行整体替换
例如:
var1="1234 4556"
tmp=var
eval test="$"$var"1"
echo $test
那么就会在屏幕上显示出 :
1234 4556
################################################
eval是将其后的字符串当成命令来执行如
eval "ls -l"
就是
命令ls -l
####################################################
语法:eval cmdLine
eval会对后面的 cmdLine 进行两遍扫描,如果第一遍扫描后 cmdLine 是个普通命令,则执行此命令;
如果 cmdLine 中含有变量的间接引用,则保证间接引用的语义