nous voulons construire 6 dossiers de points de montage comme exemple
/data/sdb
/data/sdc
/data/sdd
/data/sde
/data/sdf
/data/sdg
nous avons donc écrit ce simple script bash en utilisant un tableau
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
maintenant nous voulons changer le code sans compteur et laisser = $ counter = counter + 1
est-il possible de décaler chaque boucle du tableau afin d'obtenir la prochaine valeur du tableau?
comme quelque chose comme
${folderArray[++]}
for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6
ça sert car il n'est pas utilisé dans le corps de la boucle?for i in "your_list_goes_here"; do mkdir /data/"$i"; done
?Réponses:
Une remarque générale. Il n'est pas logique de définir un tableau comme celui-ci:
Vous feriez cela à la place:
Passons maintenant à votre question:
ou
la source
set -- $list_of_folders
mais encore une fois: les variables de chaîne ne sont pas la voie à suivre:set -- "${folders[@]}"
set -- ....
? ce hack n'est nécessaire que dans les shells qui ne prennent pas en charge les tableaux - il n'est pas nécessaire de le faire dans un shell qui prend en charge les tableaux.for folder_name in "${folderArray[@]}"; do ... ; done
c'est tout ce qu'il faut.set
approche.Pour répondre à la question dans le titre, vous pouvez "décaler" un tableau avec la notation sous-chaîne / sous-matrice. (
shift
lui - même ne fonctionne qu'avec les paramètres de position.)De même, pour «faire sauter» le dernier élément du tableau:
a=("${a[@]:0:${#a[@]} - 1}" )
ouunset "a[${#a[@]}-1]"
Donc, si vous le souhaitez, vous pouvez le faire:
Mais il supprime les tableaux, donc juste l'indexation comme d'habitude pourrait être mieux. Ou utilisez plutôt un tableau associatif:
la source
Vous pouvez simplement parcourir toutes les valeurs, sans décalage nécessaire:
la source
Vous n'avez pas besoin de boucle pour ça:
L'astuce est que si un tableau est entre guillemets doubles avec indice
*
("${array[*]}"
), il se développe en un seul mot avec la valeur de chaque élément du tableau séparé par le premier caractère de laIFS
variable. Après cela, nous utilisons un mécanisme d'expansion d'accolade pour attacher/data/
à chaque membre du tableau eteval
évaluer le tout.la source
cd /data ; mkdir "${folderArray[@]}"
J'ai fait la même chose auparavant mais je ne le ferais pas dans un cas comme celui-ci. Mais +1 pour l'approche avancée.mkdir
commande. Et même un tableau n'est pas nécessaire,cd /data; mkdir abc def
comme le ferait une personne normale. Mais ne peut pas être aussi simple pour d'autres tâches, il est donc bon de savoir comment attacher rapidement une chaîne à chaque élément du tableau sans boucle.echo "${folderArray[((counter++))]}"
si vous aimez vraiment cette approche. Les choses à l'intérieur(())
sont évaluées comme des mathématiques (notez l'absence de$
devantcounter
).