无法理解bash脚本:$ @等

时间:2016-06-28 04:31:01

标签: bash

我正在查看此bash脚本并且无法理解。 我可以理解$ @是所有位置参数(来自shell的参数)而#array [@]表示参数的数量。 (更不用说它的奇怪语法..)。其余的我不明白..

#/bin/bash

array=( $@ )
len=${#array[@]}
EXTRA_ARGS=${array[@]:2:$len}
EXTRA_ARGS_SLUG=${EXTRA_ARGS// /_}

编辑:哦,我意识到,第三行是从数组中获取一些参数范围,最后一行是将所有参数连接到' _'。

3 个答案:

答案 0 :(得分:1)

EXTRA_ARGS_SLUG = $ {EXTRA_ARGS // / _}

用下划线/ _

替换空格/ /

答案 1 :(得分:0)

最后两个是bash中参数扩展的子类。

${array[@]:2:$len}是数组切片模式。语法是:

${parameter:offset:length}

因此它将从索引2开始输出数组元素到变量$len包含的任何长度。

${EXTRA_ARGS// /_}是替换模式。语法是:

${parameter//pattern/replacement}    

参数EXTRA_ARGS中的所有空格都替换为_

要仅替换第一个匹配项,将使用模式${EXTRA_ARGS/ /_}

答案 2 :(得分:0)

此代码不正确,因为它忽略了使用$@的原因:保护在参数中出现的空格。您应该始终引用$@。通过赋值给EXTRA_ARGS,您将无法区分属于参数的空格和分隔参数的空格。

array=( "$@" )
EXTRA_ARGS=( "${array[@]:2:$len}" )
OLD_IFS=$IFS; IFS=_; EXTRA_ARGS_SLUG=${EXTRA_ARGS[*]}; IFS=$OLD_IFS

你实际上并不需要数组;您可以直接使用$@

EXTRA_ARGS=( "${@:3:$len}" )  # positional parameters are numbered from 1, though