LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: yongjian

关于array中的变量替换? [分享]

[复制链接]
 楼主| 发表于 2004-5-5 23:47:05 | 显示全部楼层
感谢了! 其实我是看到很多兄弟学习到了方法后应用到了不同的平台上但是发现语法不一样,或是命令不支持,才将不同的系统中的差异写出来的.主要是希望看到这个帖的兄弟不要什么都照搬照套.Linux和Unix在CLI上还是有很多差异的. 以后我都会将代码能够应用的平台和shell注明的.
To 教主: 教主说的是,我以前确实是对变量替换的概念理解的不够深,特别是对array的变量替换. 不过现在我知道了. 其实很简单, 变量替换符${}内是不能再存在变量的. 不论是'$'{array$num[$index]}的写法,还是'${array'$num[$index]'}'的写法, 都是为了esc前10步,将结果交给eval . 当然,教主的写法简单一些.
发表于 2004-5-5 23:55:09 | 显示全部楼层
yongjian兄努力!:2cool
 楼主| 发表于 2004-5-6 00:19:46 | 显示全部楼层
在Linux下bash下还有一种对于简单变量的替换方法, a=b;b=c;echo ${!a},但是只是对于Linux的bash, ksh都不行. array变量好象也是无法应用的.
发表于 2007-11-29 10:29:27 | 显示全部楼层

其实,这是间接引用在数组上的实现问题

#!/usr/bin/bash
#其实,这是间接引用在数组上的实现问
#我是最近才学习使用SHELL编程。
#在数组方面的间接引用,我一般是这样处理的:
r1="rt"
r2="tt"
ttrt=( "dfgsd"  "fdsfds"  "sfsf"   "eeefds" )
eval tt$r2='${ttrt[@]}' # tttt=( "dfgsd"  "fdsfds"  "sfsf"   "eeefds" )
#生成tt$rt所指的tttt数组
echo "..1.. "${tttt[@]}
i=2
eval tt$r1[$i]="op"  #  ttrt[2]='"op"
#间接引用tt$rt[$i]所指的数组成员
echo "..2..ttrt[@]="${ttrt[@]}
p="cc"

eval $p'['$i']'=${ttrt[2]}
#间接生成数组 cc[2]=op
echo "..3..cc[2]="${cc[2]}  # op
# 输出验证 cc[2]=op
echo  "..4..ttrt[2]="${ttrt[2]}
# 执行 ls -l 命令
#输出验证 ttrt[2]=op
echo "..."
ttrt[2]='ls  -l'
#ttrt[2] 赋值为命令ls -l
eval $p'['$i']'='${ttrt[2]}'  # 注意,用单引号 ' '为好
eval '${'$p'['$i']}'  # 执行ls -l 命令
# 执行 ls -l 命令

eval $p'['$i']'=oooppp #'
eval c='${'$p'['$i']}'
# 以上为= 两边的间接引用方法
echo $c
#输出oooppp
#   这是赋值变量的间接引用注意是在= 的左边,在=右边的引用常见到
##这种方法是函数的传递参数是很有用的,我们传一个数组的名给一个变量的名称,就可以#处理液体个数组
exit

#一下是输出
[wu@myhost ~]$ bash tt
..1.. dfgsd fdsfds sfsf eeefds
..2..ttrt[@]=dfgsd fdsfds op eeefds
..3..cc[2]=op
..4..ttrt[2]=op
...
总计 21
drwx------ 3 wu   dgc    320 11-27 11:34 Desktop
drwxr-xr-x 3 wu   dgc  10040 2007-03-30 abs-3.9.1_cn
drwxr-xr-x 3 root root    72 11-26 16:38 core
drwxr-xr-x 6 wu   dgc   3200 11-28 14:41 down
-rw-r--r-- 1 wu   dgc    142 11-25 13:45 pp
-rw-r--r-- 1 wu   dgc   1615 11-29 10:46 tt
oooppp

注:清楚的表述见  http://www.linuxsir.cn/bbs/showthread.php?t=318428&highlight=
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-1 07:27:35 | 显示全部楼层
Post by zswlb9999;1789087
#!/usr/bin/bash
#其实,这是间接引用在数组上的实现问
#我是最近才学习使用SHELL编程。
#在数组方面的间接引用,我一般是这样处理的:
r1="rt"
r2="tt"
ttrt=( "dfgsd"  "fdsfds"  "sfsf"   "eeefds" )
eval tt$r2='${ttrt[@]}' # tttt=( "dfgsd"  "fdsfds"  "sfsf"   "eeefds" )
#生成tt$rt所指的tttt数组
echo "..1.. "${tttt[@]}
i=2
eval tt$r1[$i]="op"  #  ttrt[2]='"op"
#间接引用tt$rt[$i]所指的数组成员
echo "..2..ttrt[@]="${ttrt[@]}
p="cc"

eval $p'['$i']'=${ttrt[2]}
#间接生成数组 cc[2]=op
echo "..3..cc[2]="${cc[2]}  # op
# 输出验证 cc[2]=op
echo  "..4..ttrt[2]="${ttrt[2]}
# 执行 ls -l 命令
#输出验证 ttrt[2]=op
echo "..."
ttrt[2]='ls  -l'
#ttrt[2] 赋值为命令ls -l
eval $p'['$i']'='${ttrt[2]}'  # 注意,用单引号 ' '为好
eval '${'$p'['$i']}'  # 执行ls -l 命令
# 执行 ls -l 命令

eval $p'['$i']'=oooppp #'
eval c='${'$p'['$i']}'
# 以上为= 两边的间接引用方法
echo $c
#输出oooppp
#   这是赋值变量的间接引用注意是在= 的左边,在=右边的引用常见到
##这种方法是函数的传递参数是很有用的,我们传一个数组的名给一个变量的名称,就可以#处理液体个数组
exit

#一下是输出
[wu@myhost ~]$ bash tt
..1.. dfgsd fdsfds sfsf eeefds
..2..ttrt[@]=dfgsd fdsfds op eeefds
..3..cc[2]=op
..4..ttrt[2]=op
...
总计 21
drwx------ 3 wu   dgc    320 11-27 11:34 Desktop
drwxr-xr-x 3 wu   dgc  10040 2007-03-30 abs-3.9.1_cn
drwxr-xr-x 3 root root    72 11-26 16:38 core
drwxr-xr-x 6 wu   dgc   3200 11-28 14:41 down
-rw-r--r-- 1 wu   dgc    142 11-25 13:45 pp
-rw-r--r-- 1 wu   dgc   1615 11-29 10:46 tt
oooppp


好帖!最喜欢看这种研究帖。eval的确是解决动态替换的利剑。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表