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 $tmp done
这里的$var即数组arr里的元素,可以看到成功的输出了预期值: