首页 > 代码库 > bash的一些小技巧

bash的一些小技巧

1、从输入读入变量

eg:read -ep "input yes or no: " flag

技术分享

用e选项表示编辑,可以使用backspace删除

2、数组

a、索引数组

declare -a arr=(var1 var2 var3) 用空格分割,如果直接访问变量$arr,

则获取的是数组的第一个元素,访问要是用${arr[idx]}来。

也可声明数组后再赋值,即declare -a arr;arr[0]=var1;arr[1]=var2;arr[3]=var3

如下:

技术分享

获取所有数组元素把索引换为@,获取数组长度则要在获取所有数组的变量前加#

如下:

技术分享

b、关联数组

关联数组把-a,换为-A即可,其它和索引数组类似,但是直接访问变量将没有输出。

这也好理解,因为没有第一个元素的概念了,而且可以看到获取所有key对应的值时,也是没有顺序的。

技术分享

3、字符串转变量

使用eval命令求值

技术分享

eval可以用返回值存储变量,这就有可以和关联数组,实现比较好玩的东西了。

4、多维数组

declare -A map1=(        [key1]=a1        [key2]=b1    )declare -A map2=(        [key1]=a2        [key2]=b2        )declare -a arr=(map1 map2)

如果这时候想获取数组arr里的第一个元素的key1值,估计大家会想到

tmp=${arr[0]};echo ${tmp[key1]}

然而输出的是map1,因为map1只是个字符串,并不是指向$map1变量。

于是可能会想到,这么修改,declare -a arr=($map1 $map2),可是结果是什么也没输出。

后来我找了一些资料,也没找到解决的方法。或许是bash不支持。

让我们用eval来试试。

eval tmp="\${map1[key1]}";echo $tmp;

\$表示转义,即不要当变量解析,可以看到成功输出a1。

那么我们把map1构造出来,${arr[0]}即map1,完整如下:

eval tmp="\${${arr[0]}[key1]}";echo $tmp

那么我们就可以在循环里做些事情了:

declare -A map1=(        [key1]=a1        [key2]=b1    )declare -A map2=(        [key1]=a2        [key2]=b2        )declare -a arr=(map1 map2)for var in ${arr[@]}; do    eval tmp="\${$var[key1]}"    echo $tmpdone    

这里的$var即数组arr里的元素,可以看到成功的输出了预期值:

技术分享

 

bash的一些小技巧