LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 5242|回复: 14

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

[复制链接]
发表于 2004-5-5 00:48:16 | 显示全部楼层 |阅读模式
有这样一个较复杂的命令, 这里列出其中11个args的array.

  1. option1=("choice" "-enable")
  2. option2=("-c" "120")
  3. option3=("-start" "001")
  4. option4=("-stop")
  5. option5=("-Rule" "rule1 day1:day2")
  6. option6=("-interval" "06:33" "13:03")
  7. option7=("-t" "name1" "value1")
  8. option8=("-e" "event1")
  9. option9=("-o" "4")
  10. option10=("-h" "1")
复制代码

对于array的变量替换尝试了多种方法:

  1. for i in $(seq 10); do         
  2.               #stdout option1 的第一个和第二个element.
  3.               echo ${option$i[1]} ${option$i[2]}         #错误写法.
  4.               eval echo \$"option"$i; eval echo \$"option"$i[1]  #第一个ok,第二个不行.
  5.               eval echo \$${option"$i"[1]}; eval echo \$${option$i[1]} #报错
  6.               #尝试了很多写法,最后试出来了正确的array替换表达式:
  7.               [color=red]eval echo \$"{option"$i[0]"}";eval echo \$"{option"$i[1]"}"[/color]
  8. done
复制代码


下面的方法列出所有的ARGS:

  1. j=0
  2. ARGS=""
  3. for i in $(seq 10); do
  4.         j=0
  5.         while [ $j -le $(eval echo \$'{#option'$i[@]'}') ]; do
  6.                 NEWARGS=$(eval echo \$'{option'$i[$j]'}')
  7.                 ARGS="$ARGS $NEWARGS"
  8.                 j=$((++j))
  9.         done
  10. done
  11. echo $ARGS
复制代码


还有什么好的办法, 也请分享. 谢谢!
发表于 2004-5-5 01:38:18 | 显示全部楼层
your code is very Excellent
 楼主| 发表于 2004-5-5 02:13:02 | 显示全部楼层
谢谢javalee兄加精. 我在ksh中试for loop的C形式写法,不认. ksh中是不是不能用C型写法呢. 个人感觉shell的C语法形式较简练.
发表于 2004-5-5 10:19:08 | 显示全部楼层
嗯,不错。
这其实就是"命令行处理"的应用例子。
发表于 2004-5-5 12:44:46 | 显示全部楼层
最初由 yongjian 发表
谢谢javalee兄加精. 我在ksh中试for loop的C形式写法,不认. ksh中是不是不能用C型写法呢. 个人感觉shell的C语法形式较简练.

我用的pdksh不支持你说的那种写法~~.ksh的版本比较多,目前的版本多是ksh93以后的~~,各个版本的兼容性很差!
 楼主| 发表于 2004-5-5 22:02:45 | 显示全部楼层
这个方法在Unix中不行! 只能用于Linux bash! (已在AIX上试过)
1. seq cmd在Unix中没有.
2. 替换的语法不一样.
3. Unix上不支持C型语法,所以j=$((++j))不work.
 楼主| 发表于 2004-5-5 22:06:16 | 显示全部楼层
给出Unix上的写法,略有不同:

  1.                 for i in 1 2 3 4 5 6 7 8 9 10; do
  2.                         j=0
  3.                         while [ $j -le $(eval echo '${#option'$i[@]'}') ]; do
  4.                                 NEWARGS=$(eval echo '${option'$i[$j]'}')
  5.                                 ARGS="$ARGS $NEWARGS"
  6.                                 let j=j+1
  7.                         done
  8.                 done
  9.                 echo $ARGS
复制代码
 楼主| 发表于 2004-5-5 22:09:52 | 显示全部楼层
哦, 对了. ksh上定义array的方法也不一样. 楼顶帖中的方法是bash的. ksh中是

  1. set -A arrayname element1 element2 ...
复制代码

这个javalee兄较熟...
发表于 2004-5-5 22:21:32 | 显示全部楼层
最初由 yongjian 发表
这个方法在Unix中不行! 只能用于Linux bash! (已在AIX上试过)
1. seq cmd在Unix中没有.
2. 替换的语法不一样.
3. Unix上不支持C型语法,所以j=$((++j))不work.

咱们是linux论坛,应该以linux为主,
另外,建议兄弟贴的时候注明一下系统环境和shell种类, OK:thank
发表于 2004-5-5 22:22:53 | 显示全部楼层
yongjian兄,你的方法有点冗余,其实这个数组引用一点都不神秘,掌握了"命令行处理"后,使用eval来构造智能命令行也不难。知其然,更要知其所以然,这才是学习的目的。
ps:老是实践,也说明兄弟对于命令行处理的概念不清晰,把握地不好。
修正如下:

  1. hk@debian:/etc/init.d$ array1[1]=hihi
  2. hk@debian:/etc/init.d$ array1[2]=you
  3. hk@debian:/etc/init.d$ num=1
  4. hk@debian:/etc/init.d$ index=2
  5. hk@debian:/etc/init.d$ [color=red]eval echo '$'{array$num[$index]}[/color]
  6. you
复制代码

如精华帖子所言
http://www.linuxsir.cn/forum.php?mod=viewthread&tid=99465
我分析一下:
1.单引号跳过了前10步处理,于是第一个"$"不变
2.正常地进行$var变量替换,其余普通字符保留,于是,第一次命令行处理结果为eval echo ${array1[2]}
3.eval再次执行一次处理过的命令行,命令处理为echo ${array1[2]}
4.执行命令,结果如上所示例,达到动态引用数组的效果

很佩服兄弟的实践精神,我希望兄弟能再做好一点,在实践的同时,不要忘了上升为理论,这样才达到学习的目的,要学的知识有很多,关键是掌握规律,掌握了规律,学一当十也:thank
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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