2016-06-28 7 views
-1

Ich schaue auf diese Bash-Skript und kann nicht verstehen. Ich kann verstehen, $ @ ist alle Positionsparameter (Argumente von Shell) und #array [@] bedeutet die Anzahl der Parameter. (geschweige denn seine queer Syntax ..). Der Rest verstehe ich nicht ..

#/bin/bash 

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

EDIT: oh, erkannte ich, die dritte Zeile ist eine Reihe von Parametern aus dem Array nehmen, und die letzte Zeile macht alle Parameter verketten mit ‚_‘ .

+0

Alles ist in dem [bash Handbuch] (https://www.gnu.org/software/bash/manual/bashref.html). Beginnen Sie mit dem Abschnitt _6.7 Arrays_. – CristiFati

+0

auch, http://mywiki.wooledge.org/BashGuide/Parameters und http://mywiki.wooledge.org/BashFAQ/073 – Sundeep

+0

http://explainshell.com/ ist dein Freund hier. EDIT: OK, nicht hier. Diese dumme Seite scheint Arrays und Parametererweiterung nicht zu verstehen. – anishsane

Antwort

1

EXTRA_ARGS_SLUG = $ {// extra_args/_}

ersetzt Raum// durch Strich/_

0

Die letzten zwei Subklassen von Parameter-Erweiterung sind in bash.


${array[@]:2:$len} ist slicing Array-Muster. Die Syntax lautet:

${parameter:offset:length} 

So wird es Ausgang Array-Element aus dem Index beginnend 2, was auch immer die Länge variable $len enthält.


${EXTRA_ARGS// /_} ist Ersatzmuster. Die Syntax ist:

${parameter//pattern/replacement}  

Alle Räume im Parameter EXTRA_ARGS mit _ ersetzt.

Um nur das erste Vorkommen zu ersetzen, wird das Muster ${EXTRA_ARGS/ /_} verwendet.

0

Dieser Code ist falsch, weil es den Grund ignoriert, [email protected] zu verwenden, um Leerzeichen zu schützen, die auftreten in Argumente. Sie sollten immer [email protected] angeben. Durch die Zuweisung an EXTRA_ARGS verlieren Sie die Fähigkeit, zwischen Leerzeichen, die Teil eines Arguments sind, und Leerzeichen, die Argumente trennen, zu unterscheiden.

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

Sie brauchen das Array nicht wirklich; Sie können mit [email protected] direkt arbeiten:

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