查看 bash(1) 手册页中的“数组”部分,我没有找到对数组进行切片的方法。
所以我想出了这个过于复杂的功能:
#!/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 )" }
像这样使用:
$ A=( foo bar "a b c" 42 ) $ slice B A 1 2 $ echo "${B[0]}" # bar $ echo "${B[1]}" # a b c
有一个更好的方法吗?
请参阅Bash页面中的参数扩展部分。返回数组的内容,取长度为 2 的切片,从索引 1 开始。man``A[@]``:1:2
man``A[@]``:1:2
A=( foo bar "a b c" 42 ) B=("${A[@]:1:2}") C=("${A[@]:1}") # slice to the end of the array echo "${B[@]}" # bar a b c echo "${B[1]}" # a b c echo "${C[@]}" # bar a b c 42 echo "${C[@]: -2:2}" # a b c 42 # The space before the - is necesssary
请注意,a b c保留了一个数组元素(并且它包含一个额外的空格)这一事实。
a b c