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[@]}; doeval tmp="\${$var[key1]}"echo $tmpdone
這里的$var即數組arr里的元素,可以看到成功的輸出了預期值:
?