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