can';无法理解bash脚本:$@等

can';无法理解bash脚本:$@等,bash,Bash,我正在看这个bash脚本,无法理解。 我可以理解$@是所有的位置参数(来自shell的参数),而#array[@]表示参数的数量。(更不用说它奇怪的语法了。)。其余的我不明白 #/bin/bash array=( $@ ) len=${#array[@]} EXTRA_ARGS=${array[@]:2:$len} EXTRA_ARGS_SLUG=${EXTRA_ARGS// /_} 编辑:哦,我意识到,第三行是从数组中获取一些参数,最后一行是将所有参数与'.'.'连接起来。EXTRA.\u

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

#/bin/bash

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

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

EXTRA.\u ARGS.\u SLUG=${EXTRA.\u ARGS///}


用下划线替换空格//最后两个是
bash
中参数扩展的子类


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

${parameter:offset:length}
${parameter//pattern/replacement}    
因此,它将输出从索引2开始的数组元素到变量
$len
包含的任何长度


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

${parameter:offset:length}
${parameter//pattern/replacement}    
参数
额外参数
中的所有空格均替换为


要仅替换第一次出现的内容,将使用模式
${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

一切都在计划之中。从6.7阵列部分开始。同时,我也是您的朋友。编辑:好的,不在这里。另一方面,你应该在参数扩展中使用引号,例如,
“$@”
而不是
$
另外,我认为你应该使用
EXTRA_ARGS_SLUG=(“${EXTRA_ARGS[@]//}”)
而不是
EXTRA_ARGS_SLUG={EXTRA_ARGS//}