Im Abschnitt "Array" in der Bash (1) -Manpage habe ich keine Möglichkeit gefunden, ein Array in Scheiben zu schneiden.
Also habe ich mir diese übermäßig komplizierte Funktion ausgedacht:
#!/bin/bash
# @brief: slice a bash array
# @arg1: output-name
# @arg2: input-name
# @args: seq args
# ----------------------------------------------
function slice() {
local output=$1
local input=$2
shift 2
local indexes=$(seq $*)
local -i i
local tmp=$(for i in $indexes
do echo "$(eval echo \"\${$input[$i]}\")"
done)
local IFS=$'\n'
eval $output="( \$tmp )"
}
So verwendet:
$ A=( foo bar "a b c" 42 )
$ slice B A 1 2
$ echo "${B[0]}" # bar
$ echo "${B[1]}" # a b c
Gibt es einen besseren Weg, dies zu tun?
Antworten:
Siehe den Abschnitt Parametererweiterung auf der
man
Seite Bash .A[@]
Gibt den Inhalt des Arrays zurück und:1:2
nimmt ein Segment der Länge 2, beginnend mit Index 1.Beachten Sie, dass die Tatsache, dass "ab c" ein Array-Element ist (und einen zusätzlichen Speicherplatz enthält), erhalten bleibt.
quelle
idx=(${!A[@]}); echo ${idx[@]:1}
.${@:1:2}
$@
in ein richtiges Array konvertieren musste , bevor ich dies tat, oder Argumente, die Leerzeichen enthielten, wurden aufgeteilt:ARGS=( "$@" ); ARGS_AFTER_FIRST=( "${ARGS[@]:1}" )
Es gibt auch eine praktische Verknüpfung, mit der alle Elemente des Arrays ab dem angegebenen Index abgerufen werden können. Zum Beispiel wäre "$ {A [@]: 1}" das "Ende" des Arrays, dh das Array ohne sein erstes Element.
quelle
echo "${A[@]::1}" # 4
"${${@}[@]:1}"
.${@:2}
funktioniert aber gut.Array-Slicing wie in Python (aus der Rebash- Bibliothek):
quelle
Nehmen wir an, ich lese ein Array vom Benutzer, dann möchte ich die Elemente 3 bis 7 einschließlich sehen.
quelle