queremos construir 6 pastas de pontos de montagem como exemplo
/data/sdb
/data/sdc
/data/sdd
/data/sde
/data/sdf
/data/sdg
então escrevemos esse 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 vamos = $ counter = counter + 1
é possível mudar cada loop da matriz para obter o próximo valor da matriz?
como algo como
${folderArray[++]}
for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6
para como ele não está sendo usado dentro do corpo de loop?for i in "your_list_goes_here"; do mkdir /data/"$i"; done
?Respostas:
Uma observação geral. Não faz sentido definir uma matriz como esta:
Você faria isso:
Agora à sua pergunta:
ou
fonte
set -- $list_of_folders
mais uma vez: Variáveis de seqüência de caracteres não são o caminho a seguir:set -- "${folders[@]}"
set -- ....
? esse hack é necessário apenas em shells que não suportam matrizes - não é necessário em um shell que suporta matrizes.for folder_name in "${folderArray[@]}"; do ... ; done
é tudo o que é necessário.set
abordagem.Para responder à pergunta no título, você pode "mudar" uma matriz com a notação de substring / subarray. (
shift
ele funciona apenas com os parâmetros posicionais.)Da mesma forma, para 'destacar' o último item da matriz:
a=("${a[@]:0:${#a[@]} - 1}" )
ouunset "a[${#a[@]}-1]"
Então, se você quiser, você pode fazer o seguinte:
Mas isso destrói as matrizes, portanto, apenas a indexação como de costume pode ser melhor. Ou talvez use uma matriz associativa:
fonte
Você pode simplesmente fazer um loop sobre todos os valores, sem necessidade de mudança:
fonte
Você não precisa de nenhum loop para isso:
O truque é que, se uma matriz é citada duas vezes com subscript
*
("${array[*]}"
), ela se expande para uma única palavra com o valor de cada elemento da matriz separado pelo primeiro caractere daIFS
variável. Depois disso, usamos o mecanismo de expansão de chaves para anexar/data/
a cada membro da matriz eeval
atualizar a coisa toda.fonte
cd /data ; mkdir "${folderArray[@]}"
Eu fiz o mesmo antes, mas não faria em um caso como este. Mas +1 para a abordagem avançada.mkdir
comando. E até mesmo o array não é necessário,cd /data; mkdir abc def
como faria uma pessoa normal. Mas não poderia ser tão simples para outras tarefas, por isso é bom saber como anexar rapidamente uma string a cada elemento da matriz sem um loop.echo "${folderArray[((counter++))]}"
se realmente gosta dessa abordagem. O material interno(())
é avaliado como matemática (observe falta de$
na frentecounter
).