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 disk6
para 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_folders
pero 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 ... ; done
es todo lo que se necesitaset
enfoque.Para responder la pregunta en el título, puede "desplazar" una matriz con la notación de subcadena / submatriz. (
shift
funciona 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 laIFS
variable. Después de eso, usamos un mecanismo de expansión de llaves para unir/data/
a cada miembro de la matriz yeval
evaluar 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.mkdir
comando. E incluso la matriz no es necesaria, talcd /data; mkdir abc def
como 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
).