Melihat bagian "Array" di halaman manual bash (1), saya tidak menemukan cara untuk mengiris array.
Jadi saya datang dengan fungsi yang terlalu rumit ini:
#!/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 )"
}
Digunakan seperti ini:
$ A=( foo bar "a b c" 42 )
$ slice B A 1 2
$ echo "${B[0]}" # bar
$ echo "${B[1]}" # a b c
Apakah ada cara yang lebih baik untuk melakukan ini?
Jawaban:
Lihat bagian Ekspansi Parameter di
man
halaman Bash .A[@]
mengembalikan konten array,:1:2
membutuhkan sepotong panjang 2, mulai dari indeks 1.Perhatikan bahwa fakta bahwa "ab c" adalah satu elemen array (dan itu berisi ruang tambahan) dipertahankan.
sumber
idx=(${!A[@]}); echo ${idx[@]:1}
.${@:1:2}
$@
ke array yang tepat sebelum melakukan ini atau argumen yang berisi spasi akan terpecah:ARGS=( "$@" ); ARGS_AFTER_FIRST=( "${ARGS[@]:1}" )
Ada juga jalan pintas yang nyaman untuk mendapatkan semua elemen array dimulai dengan indeks yang ditentukan. Misalnya "$ {A [@]: 1}" akan menjadi "ekor" dari array, yaitu array tanpa elemen pertama.
sumber
echo "${A[@]::1}" # 4
"${${@}[@]:1}"
.${@:2}
berfungsi dengan baik.Array mengiris seperti di Python (Dari perpustakaan rebash ):
sumber
Katakanlah saya membaca array dari pengguna, maka saya ingin melihat elemen 3 hingga 7 termasuk keduanya.
sumber