Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1308772
  • 博文数量: 273
  • 博客积分: 5865
  • 博客等级: 准将
  • 技术积分: 3280
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-11 10:01
文章分类

全部博文(273)

文章存档

2015年(33)

2014年(11)

2013年(11)

2012年(136)

2011年(32)

2010年(50)

分类: 系统运维

2012-07-28 17:07:19

  1. #!/bin/sh
  2. a1="11 12 13"
  3. a2="21 22 23"
  4. a3="31 32 33"
  5. for index in a1 a2 a3
  6. do
  7.   eval d1=\$$index
  8.   for d2 in $d1
  9.   do
  10.     echo $d2
  11.   done
  12. done
  13. #----- eof -----#

 

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 中含有变量的间接引用,则保证间接引用的语义

阅读(8128) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~