queremos construir 6 pastas de ponto de montagem como exemplo
/data/sdb
/data/sdc
/data/sdd
/data/sde
/data/sdf
/data/sdg
então escrevemos este script bash simples usando array
folder_mount_point_list="sdb sdc sdd sde sdf sdg"
folderArray=( $folder_mount_point_list )
counter=0
for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6
do
folder_name=${folderArray[counter]}
mkdir /data/$folder_name
let counter=$counter+1
done
agora queremos mudar o código sem contador e let=$counter=counter+1
é possível deslocar cada loop da matriz para obter o próximo valor da matriz?
como algo como
${folderArray[++]}
Para responder à pergunta do título, você pode "deslocar" um array com a notação substring/subarray.
shift
em si funciona apenas com os parâmetros posicionais.Da mesma forma, para 'retirar' o último item da matriz:
a=("${a[@]:0:${#a[@]} - 1}" )
ouunset "a[${#a[@]}-1]"
Então, se você quiser, você pode fazer isso:
Mas isso destrói as matrizes e as atribuições de "mudança" provavelmente copiam os dados desnecessariamente, portanto, apenas indexar como de costume pode ser melhor .
Ou talvez use um array associativo, se você não se importa com a ordem dos itens.
"${!arr[@]}"
fornece as chaves em uma ordem não especificada, provavelmente não na ordem em que foram atribuídas:Uma observação geral. Não faz sentido definir um array assim:
Você faria isso em vez disso:
Agora a sua pergunta:
ou
Você pode simplesmente percorrer todos os valores, sem necessidade de deslocamento:
Você não precisa de nenhum loop para isso:
O truque é que, se um array estiver entre aspas duplas com subscrito
*
("${array[*]}"
), ele se expandirá para uma única palavra com o valor de cada elemento do array separado pelo primeiro caractere daIFS
variável. Depois disso, usamos o mecanismo de expansão de colchetes para anexar/data/
a cada membro da matriz eeval
atualizar tudo.A pergunta que você está fazendo é como usar
++
para incrementar um índice de array.Assim:
O índice de um array (o que está dentro do
[]
) está em um ambiente Aritmético, então o pós incremento (++
) funciona.A pergunta do título usa o termo
shift
. Mudar como os argumentos posicionais pode ser feito reconstruindo a matriz (um processo lento).Mas parece mais simples usar os índices do array diretamente: