2016-06-28 26 views
-1

我在看這個bash腳本並且無法理解。 我可以理解$ @是所有位置參數(來自shell的參數)和#array [@]意味着參數的數量。 (更不用說其奇怪的語法..)。其餘的我不明白..

#/bin/bash 

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

編輯:哦,我意識到,第三行正在採取一些參數範圍從陣列中,最後一行是幹什麼用連接所有的參數「_」 。

+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/是你的朋友在這裏。編輯:好的,不在這裏。那個愚蠢的一面似乎並不理解數組和參數的擴展。 – 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