1、{start..end..step}
跟$(seq start end)功能一樣,生成從start至end的序列,閉合區間。
step默認爲1。
for i in {1..5}; do echo $i; done
>>> 1 2 3 4 5
可以在前面增加前綴,很方便的,如果使用$(seq ...)的話,達不到這種效果
for i in 6{1..5}; do echo $i; done
>>> 61 62 63 64 65
for i in 6$(seq 1 5); do echo $i; done
>>> 61 2 3 4 5 # 只跟第一個元素結合了~~
2、${!arr[@]}
用於返回數組array的所有下標
arr=(h0 h1 h2 h3)
for i in ${!arr[@]}; do echo $i; done
>>> 0 1 2 3
arr[10]=h10
for i in ${!arr[@]}; do echo $i; done
>>> 0 1 2 3 10
初始化數組arr時,數組下標是從0開始遞增的,所以這裏直接對arr[10]進行賦值,以空缺中間的下標,打印其下標如上。
3、${!var@}
用於返回當前shell中,變量名以var開始的變量;這種格式跟第2種很相似,可是功能卻完全不同。
var1=hello1
var2=hello2
echo ${!var@}
>>> var1 var2
var=hello
echo ${!var@}
>>> var var1 var2
變量的輸出,不是以定義的先後爲順序的,這一點需要注意。
4、${!var}
用於返回以var變量的值命名的變量的值,這話很難理解,其實有些類似C裏面的指針,看代碼就明白了。
tmp_path=/tmp
path=tmp_path
echo ${!path}
>>> /tmp
shell先將path解析出來,得到tmp_path,再取tmp_path的值,所以得到結果/tmp。
使用eval的方法稍顯麻煩:
eval echo \$$path
>>> /tmp