LinuxSir.cn,穿越时空的Linuxsir!

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

如果我要引用的变量名里面含有变量,该如何引用?

[复制链接]
发表于 2003-11-11 09:48:22 | 显示全部楼层 |阅读模式
例如,
set k=1
set e1=123

我想通过k来引用e1,譬如,${e{$K}} ,可惜这样表达不行。

有办法可以引用吗?
发表于 2003-11-11 13:40:34 | 显示全部楼层
没有这方面的印象,个人认为bash script中无此功能。
关注中。。。
发表于 2003-11-12 10:37:14 | 显示全部楼层
#!/bin/bash
k=1
a1=333
echo $[a$[k]]

不要小看bash,往往能完成你意想不到的功能。
 楼主| 发表于 2003-11-12 11:53:44 | 显示全部楼层
我发现这样表达有个问题,不知道怎么解释
当a1=333时,这个脚本没有问题,但是当a1=333.....333 (超过19个3),就会显示错误的结果

另外当a1=ABC (任意字符) 时,也会得到错误的结果

怎么会这样呢?
发表于 2003-11-12 13:00:41 | 显示全部楼层
最初由 scopio 发表
我发现这样表达有个问题,不知道怎么解释
当a1=333时,这个脚本没有问题,但是当a1=333.....333 (超过19个3),就会显示错误的结果

另外当a1=ABC (任意字符) 时,也会得到错误的结果

怎么会这样呢?

找到方法了,利用数组下标,但是k只能是数字。

a=(red, 255, blue, green, black)
for ((k=0;k<${#a
  • };k++));do echo ${a[$k]};done

    $[...] 和 $((...))类似,将括号内作为数学表达式计算,然后显示,不是变量扩展

    可以试试下列例子,体会一下。
    echo $[123+456/9]
    k=1
    echo $[k++]
    echo $[++k]
  • 发表于 2003-11-12 14:38:32 | 显示全部楼层
    正解应该是利用数组,所以上面的表达式用字母赋值就不对了,不过shell不是用来科学计算的,没必要用19个3来做测试吧,呵呵!
    发表于 2003-11-12 16:08:54 | 显示全部楼层
    1. [/home/javalee/myshell]set -A arg a b c d e f h i l j m w e o
    2. [/home/javalee/myshell]num=$(echo ${#arg[*]})
    3. [/home/javalee/myshell]read;if [[ $REPLY -le $num ]];then echo ${arg[$REPLY]};else echo "$REPLY IS WRONG";fi
    4. 1
    5. b
    6. [/home/javalee/myshell]r
    7. read;if [[ $REPLY -le $num ]];then echo ${arg[$REPLY]};else echo "$REPLY IS WRONG";fi
    8. 23
    9. 23 IS WRONG
    复制代码
    这是一个比较典型的通过用shell的REPLY变量来替换数组中的下标并导出结果的例子,不知道是否可以借鉴!
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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