hc6538 发表于 2018-8-22 06:43:57

linux shell的一些技巧 使用{X..Y}以及${!XXX}

  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=h10
  for i in ${!arr[@]}; do echo $i; done
  >>> 0 1 2 3 10
  初始化数组arr时,数组下标是从0开始递增的,所以这里直接对arr进行赋值,以空缺中间的下标,打印其下标如上。
  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

页: [1]
查看完整版本: linux shell的一些技巧 使用{X..Y}以及${!XXX}