queremos construir 6 carpetas de puntos de montaje como ejemplo
/data/sdb
/data/sdc
/data/sdd
/data/sde
/data/sdf
/data/sdg
así que escribimos este simple script bash 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
ahora queremos cambiar el código sin contador y dejar = $ contador = contador + 1
¿Es posible cambiar cada ciclo de la matriz para obtener el siguiente valor de la matriz?
como algo así
${folderArray[++]}

for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6para qué, ya que no se usa dentro del cuerpo del bucle?for i in "your_list_goes_here"; do mkdir /data/"$i"; done?Respuestas:
Un comentario general. No tiene sentido definir una matriz como esta:
En su lugar, haría esto:
Ahora a su pregunta:
o
fuente
set -- $list_of_folderspero de nuevo: las variables de cadena no son el camino a seguir:set -- "${folders[@]}"set -- ....? ese truco solo es necesario en shells que no admiten matrices; no es necesario en un shell que sí admite matrices.for folder_name in "${folderArray[@]}"; do ... ; donees todo lo que se necesitasetenfoque.Para responder la pregunta en el título, puede "desplazar" una matriz con la notación de subcadena / submatriz. (
shiftfunciona solo con los parámetros posicionales).Del mismo modo, para 'hacer estallar' el último elemento de la matriz:
a=("${a[@]:0:${#a[@]} - 1}" )ounset "a[${#a[@]}-1]"Entonces, si quisieras, podrías hacer esto:
Pero destruye las matrices, por lo que simplemente indexar como de costumbre podría ser mejor. O tal vez use una matriz asociativa en su lugar:
fuente
Simplemente puede recorrer todos los valores, sin necesidad de cambios:
fuente
No necesita ningún bucle para eso:
El truco es que si una matriz se cita con subíndice
*("${array[*]}"), se expande a una sola palabra con el valor de cada elemento de matriz separado por el primer carácter de laIFSvariable. Después de eso, usamos un mecanismo de expansión de llaves para unir/data/a cada miembro de la matriz yevalevaluar todo.fuente
cd /data ; mkdir "${folderArray[@]}"He hecho lo mismo antes, pero no lo haría en un caso como este. Pero +1 para el enfoque avanzado.mkdircomando. E incluso la matriz no es necesaria, talcd /data; mkdir abc defcomo lo haría una persona normal. Pero no podría ser tan simple para otras tareas, por lo que es bueno saber cómo adjuntar rápidamente una cadena a cada elemento de la matriz sin un bucle.echo "${folderArray[((counter++))]}"si realmente te gusta este enfoque. Las cosas en el interior(())se evalúan como matemáticas (observe la falta de$delantecounter).