在 shell 脚本中旋转数组元素

AKA*_*ASH 1 bash array shell-script

我想在 shell 脚本中旋转数组元素

Array=(11 22 33 44 55)
Run Code Online (Sandbox Code Playgroud)

我试过这个

Array[0]=${Array[$3]}
Run Code Online (Sandbox Code Playgroud)

但它不起作用,我得到了声明的数组。为什么?

最后我让它工作

j=0
k=3
Array[$j]=${Array[$k]}
Run Code Online (Sandbox Code Playgroud)

但问题是为什么我们不能像以前那样直接传递索引?

Sté*_*las 6

蒂姆:

Array=(11 22 33 44 55)
Array[0]=${Array[3]}   # "3", not "$3"
Run Code Online (Sandbox Code Playgroud)

这将导致:

Array=(44 22 33 44 55)
Run Code Online (Sandbox Code Playgroud)

$3扩展到第三个位置参数(shell 脚本的参数),如果它是空的(通常在交互式 shell 中),则${array[$3]}与${array[0]}or相同$array。

如果您想实现:

Array=(55 11 22 33 44)
Run Code Online (Sandbox Code Playgroud)

你需要做:

Array=("${Array[4]}" "${Array[@]:0:4}")
Run Code Online (Sandbox Code Playgroud)

或更一般地说:

Array=("${Array[@]: -1}" "${Array[@]:0:${#Array[@]}-1}")
Run Code Online (Sandbox Code Playgroud)

使用zsh,您还可以执行以下操作:

Array[1,0]=$Array[-1] # insert the last element at the beginning
Array[-1]=()          # remove the last element
Run Code Online (Sandbox Code Playgroud)

或者:

Array=("$Array[-1]" "${(@)Array[1,-2]}")
Run Code Online (Sandbox Code Playgroud)

与yash:

array -i Array 0 "${Array[-1]}"
array -d Array -1
Run Code Online (Sandbox Code Playgroud)

使用fish(假设数组至少有 2 个元素):

set Array 11 22 33 44 55
set Array $Array[-1 1..-2]
Run Code Online (Sandbox Code Playgroud)