我正在查看此bash脚本并且无法理解。 我可以理解$ @是所有位置参数(来自shell的参数)而#array [@]表示参数的数量。 (更不用说它的奇怪语法..)。其余的我不明白..
#/bin/bash
array=( $@ )
len=${#array[@]}
EXTRA_ARGS=${array[@]:2:$len}
EXTRA_ARGS_SLUG=${EXTRA_ARGS// /_}
编辑:哦,我意识到,第三行是从数组中获取一些参数范围,最后一行是将所有参数连接到' _'。
答案 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