como mudar o valor da matriz no bash

5

queremos criar 6 pastas de pontos 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 alterar 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 parecido com

${folderArray[++]}
    
por yael 31.12.2017 / 14:28

4 respostas

4

Uma observação geral. Não faz sentido definir um array como este:

folder_mount_point_list="sdb sdc sdd sde sdf sdg"
folderArray=( $folder_mount_point_list )

Você faria isso:

folderArray=(sdb sdc sdd sde sdf sdg)

Agora, à sua pergunta:

set -- sdb sdc sdd sde sdf sdg
for folder_name; do
    mkdir "/data/$folder_name"
done

ou

set -- sdb sdc sdd sde sdf sdg
while [ $# -gt 0 ]; do
    mkdir "/data/$1"
    shift
done
    
por 31.12.2017 / 14:39
4

Para responder a pergunta no título, você pode "deslocar" uma matriz com a notação substring / subarray. ( shift funciona com apenas os parâmetros posicionais).

$ a=(a b c d e)
$ a=("${a[@]:1}")
$ echo "${a[@]}"
b c d e

Da mesma forma, para "estourar" o último item da matriz: a=("${a[@]:0:${#a[@]} - 1}" ) ou unset "a[${#a[@]}-1]"

Então, se você quiser, pode fazer isso:

a=(foo bar doo)
b=(123 456 789)
while [ "${#a[@]}" -gt 0 ] ; do
    echo "$a $b"
    a=("${a[@]:1}")
    b=("${b[@]:1}")
done

Mas isso estraga as matrizes, portanto, apenas indexar como de costume pode ser melhor. Ou talvez use uma matriz associativa:

declare -A arr=([foo]=123 [bar]=456 [doo]=789)
    
por 31.12.2017 / 16:07
3

Você pode simplesmente percorrer todos os valores, sem necessidade de mudança:

folderArray=(sdb sdc sdd sde sdf sdg)

for folder in "${folderArray[@]}"; do
    mkdir "/data/$folder"
done
    
por 31.12.2017 / 14:57
2

Você não precisa de nenhum loop para isso:

folderArray=(sdb sdc sdd sde sdf sdg)
IFS=,
eval mkdir /data/{"${folderArray[*]}"}

O truque é que, se uma matriz tiver aspas duplas com subscrito * ( "${array[*]}" ), ela se expandirá para uma única palavra com o valor de cada elemento da matriz separado pelo primeiro caractere da variável IFS . Depois disso, usamos o mecanismo de expansão de chave para anexar /data/ a cada membro da matriz e eval uate a coisa toda.

    
por 31.12.2017 / 15:00