array=(1 2 3 4 5 6 7)
min=0
max=$(( ${#array[@]} -1 ))
while [[ min -lt max ]]
do
# Swap current first and last elements
x="${array[$min]}"
array[$min]="${array[$max]}"
array[$max]="$x"
# Move closer
(( min++, max-- ))
done
echo "${array[@]}"
reverse() {
# first argument is the array to reverse
# second is the output array
declare -n arr="$1" rev="$2"
for i in "${arr[@]}"
do
rev=("$i" "${rev[@]}")
done
}
#!/bin/bash
# Declare an sparse array to test:
array=([5]=101 [6]=202 [10]=303 [11]=404 [20]=505 [21]=606 [40]=707)
echo "Initial array values"
declare -p array
swaparray(){ local temp; temp="${array[$1]}"
array[$1]="${array[$2]}"
array[$2]="$temp"
}
ind=("${!array[@]}") # non-sparse array of indexes.
min=-1; max="${#ind[@]}" # limits to one before real limits.
while [[ min++ -lt max-- ]] # move closer on each loop.
do
swaparray "${ind[min]}" "${ind[max]}" # Exchange first and last
done
echo "Final Array swapped in place"
declare -p array
echo "Final Array values"
echo "${array[@]}"
执行时:
./script
Initial array values
declare -a array=([5]="101" [6]="202" [10]="303" [11]="404" [20]="505" [21]="606" [40]="707")
Final Array swapped in place
declare -a array=([5]="707" [6]="606" [10]="505" [11]="404" [20]="303" [21]="202" [40]="101")
Final Array values
707 606 505 404 303 202 101
另一种非常规的方法:
输出:
如果
extdebug
启用,数组BASH_ARGV
在函数中包含所有位置参数的倒序。非常规的方法(都不是纯的
bash
):如果数组中的所有元素都只是一个字符(如问题中),您可以使用
rev
:否则:
如果你可以使用
zsh
:我已经按照书面形式回答了这个问题,这段代码反转了数组。(以相反的顺序打印元素而不反转数组只是一个
for
从最后一个元素倒数到零的循环。)这是一个标准的“交换第一个和最后一个”算法。它适用于奇数和偶数长度的数组。
如果你真的想在另一个数组中反转:
然后:
给出:
这应该正确处理缺少数组索引的情况,比如你有
array=([1]=1 [2]=2 [4]=4)
,在这种情况下,从 0 循环到最高索引可能会添加额外的空元素。要交换数组位置(即使是稀疏数组)(从 bash 3.0 开始):
执行时:
对于较旧的 bash,您需要使用循环(在 bash 中(自 2.04 起))并使用
$a
来避免尾随空格:对于 2.03 以来的 bash:
另外(使用按位否定运算符)(从 bash 4.2+ 开始):
丑陋的,不可维护的,但单行:
要反转任意数组(可能包含任意数量的具有任意值的元素):
与
zsh
:对于
bash
4.4+,鉴于bash
变量无论如何都不能包含 NUL 字节,您可以tac -s ''
在打印为 NUL 分隔记录的元素上使用 GNU:但是请注意,bash 数组的灵感来自 ksh 数组而不是 csh/zsh 数组,并且更像是键限制为正整数的关联数组(所谓的稀疏数组),并且该方法不保留数组的键。例如,对于任何数组,例如:
你得到
POSIXly,将唯一的 POSIX shell 数组 (
$@
, made of$1
,$2
...) 反转到位:纯 bash 解决方案,可以作为单行。
虽然我不打算讲新的东西,而且我也会用它
tac
来反转数组,但值得一提的是使用 bash 4.4 版的单行解决方案:测试:
请注意,read 中的 var 名称是原始数组的名称,因此临时存储不需要辅助数组。
通过调整 IFS 替代实施:
PS:我认为由于不同的bash 内置函数实现,上述解决方案在
bash
波纹管版本中不起作用。4.4
read
尝试这个