2016-06-28 10 views
-1

私はこのbashスクリプトを見ていて、理解できません。 $ @はすべての位置パラメータ(シェルからの引数)であり、#array [@]はパラメータの数を意味します。 (その奇妙な文法は...)私は理解していない残りの部分...

#/bin/bash 

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

EDIT:ああ、私は実現し、3行目は、アレイからのパラメータのいくつかの範囲を取っているし、最後の行は「_」ですべてのパラメータを連結やっています。

+0

すべてが[bashのマニュアル](https://www.gnu.org/software/bash/manual/bashref.html)です。 _6.7 Arrays_セクションから始めてください。 – CristiFati

+0

もhttp://mywiki.wooledge.org/BashGuide/Parametersとhttp://mywiki.wooledge.org/BashFAQ/073 – Sundeep

+0

http://explainshell.com/はあなたの友人です。編集:OK、ここではない。その愚かな側面は、配列とパラメータの拡張を理解していないようです。 – anishsane

答えて

1

EXTRA_ARGS_SLUG = $ {EXTRA_ARGS ///_}

アンダースコア/ /スペースを置き換える/ _

0

最後の二つはbashにおけるパラメータ展開のサブクラスです。


${array[@]:2:$len}は、配列スライスパターンです。構文は次のとおりです。

${parameter:offset:length} 

インデックス2から始まるので、それは意志出力配列要素どんな長さに変数$lenが含まれています。


${EXTRA_ARGS// /_}が置換パターンです。構文は次のとおりです。

${parameter//pattern/replacement}  

パラメータEXTRA_ARGSのすべてのスペースは_に置き換えられます。

最初のオカレンスだけを置換するには、パターン${EXTRA_ARGS/ /_}が使用されます。

0

このコードは、[email protected]の発生する空白を引数で保護する理由を無視するため、間違っています。あなたは常に[email protected]を引用する必要があります。 EXTRA_ARGSに代入すると、引数の一部である空白と引数を区切る空白を区別することができなくなります。

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

実際に配列は必要ありません。あなたは[email protected]を直接操作することができます

EXTRA_ARGS=("${@:3:$len}") # positional parameters are numbered from 1, though 
関連する問題