Quiero escribir un script que recorra 15 cadenas (¿matriz posiblemente?) ¿Es eso posible?
Algo como:
for databaseName in listOfNames
then
# Do something
end
Puedes usarlo así:
## declare an array variable
declare -a arr=("element1" "element2" "element3")
## now loop through the above array
for i in "${arr[@]}"
do
echo "$i"
# or do whatever with individual element of the array
done
# You can access them using echo "${arr[0]}", "${arr[1]}" also
También funciona para la declaración de matriz multilínea
declare -a arr=("element1"
"element2" "element3"
"element4"
)
Eso es posible, por supuesto.
for databaseName in a b c d e f; do
# do something like: echo $databaseName
done
Ver Bash Loops para, mientras y hasta para más detalles.
for year in $(seq 2000 2013)
.DATABASES="a b c d e f"
.Ninguna de esas respuestas incluye un contador ...
Salida:
fuente
echo "$i / ${arraylength} : ${array[$i-1]}"
contrario, si$i
contiene un globo, se expandirá, si contiene una pestaña, se cambiará a un espacio, etc.si
Salida:
Para preservar espacios; entradas de lista de comillas simples o dobles y expansiones de listas de comillas dobles.
Salida:
Para hacer una lista en varias líneas
Salida:
Lista simple variable
o
Mostrar la lista de variables:
Salida:
Recorra la lista:
Salida:
Cree una función para recorrer una lista:
Usando la palabra clave declare (comando) para crear la lista, que técnicamente se denomina matriz:
Salida:
Crear una matriz asociativa. Un diccionario:
Salida:
Variables CVS o archivos en una lista .
Cambiar el separador de campo interno de un espacio, a lo que quieras.
En el siguiente ejemplo, se cambia a una coma
Salida:
Si necesita numerarlos:
Esto se llama un tic de retroceso. Ponga el comando dentro de los ticks posteriores.
Está al lado del número uno en su teclado o encima de la tecla de tabulación. En un teclado estándar de inglés americano.
Salida es:
Familiarizarse con el comportamiento de bashes:
Crea una lista en un archivo
Lea el archivo de lista en una lista y visualice
Manual de referencia de línea de comandos de BASH: significado especial de ciertos caracteres o palabras para el shell.
fuente
"${List[@]}"
ser correcto, con las comillas .${List[@]}
Está Mal.${List[*]}
Está Mal. IntenteList=( "* first item *" "* second item *" )
: obtendrá el comportamiento correcto parafor item in "${List[@]}"; do echo "$item"; done
, pero no de cualquier otra variante.List=( "first item" "second item" )
se divide enfirst
,item
,second
,item
también).ls
producción, en contravención de las mejores prácticas .En el mismo espíritu que la respuesta de 4ndrew:
B. Sin espacios en blanco en los nombres:
Notas
listOfNames="RA RB R C RD"
tiene la misma salida.Otras formas de incorporar datos incluyen:
Leer de stdin
IFS='\n'
, o para MacOSIFS='\r'
)#!/bin/bash
en la parte superior del archivo de script indica el entorno de ejecución.Otras fuentes ( mientras lee el bucle )
fuente
IFS
. (Para todos,IFS
permite especificar un delimitador específico, lo que permite incluir otros espacios en blanco en las cadenas sin separarlos en subcadenas).$databaseName
solo contiene la lista completa, por lo tanto, solo realiza una única iteración.Puedes usar la sintaxis de
${arrayName[@]}
fuente
Sorprende que nadie haya publicado esto todavía; si necesita los índices de los elementos mientras recorre la matriz, puede hacer esto:
Salida:
Me parece mucho más elegante que el estilo "tradicional" de bucle (
for (( i=0; i<${#arr[@]}; i++ ))
).(
${!arr[@]}
y$i
no necesita ser citado porque son solo números; algunos sugerirían citarlos de todos modos, pero eso es solo una preferencia personal).fuente
Esto también es fácil de leer:
fuente
IFS=$'\n'
esto también puede funcionar para otras soluciones en este escenario.Matriz implícita para script o funciones:
Además de la respuesta correcta de anubhava : Si la sintaxis básica para loop es:
hay un caso especial engolpetazo:
Cuando se ejecuta un script o una función, argumentos adoptados en las líneas de comandos se pueden asignar a
$@
variable de matriz, se puede acceder por$1
,$2
,$3
, y así sucesivamente.Esto se puede completar (para prueba) por
Un bucle sobre esta matriz podría escribirse simplemente:
¡Tenga en cuenta que el trabajo reservado
in
no está presente y tampoco tiene un nombre de matriz!Muestra:
Tenga en cuenta que esto es lo mismo que
Luego en un guión :
Guarda esto en un script
myscript.sh
,chmod +x myscript.sh
y luegoLo mismo en una función :
Entonces
fuente
o solo
fuente
Manera simple :
fuente
La matriz declare no funciona para el shell Korn. Use el siguiente ejemplo para el shell Korn:
fuente
for i in ${foo[*]}
básicamente es siempre lo incorrecto:for i in "${foo[@]}"
es la forma que conserva los límites de la lista original y evita la expansión global. Y el eco debe serecho "$i"
Esto es similar a la respuesta del usuario 2533809, pero cada archivo se ejecutará como un comando separado.
fuente
Si está utilizando el shell Korn, hay " set -A databaseName ", de lo contrario hay " declare -a databaseName "
Para escribir un guión que funcione en todos los shells,
Debería funcionar en todos los proyectiles.
fuente
$ bash --version
GNU bash, versión 4.3.33 (0) -release (amd64-portbld-freebsd10.0)$ set -A databaseName=("db1" "db2" ....) || declare -a databaseName=("db1" "db2" ....)
bash: error de sintaxis cerca de token inesperado `('Prueba esto. Está funcionando y probado.
fuente
array=( "hello world" )
, oarrray=( "*" )
; en el primer caso se imprimiráhello
y porworld
separado, en el segundo imprimirá una lista de archivos en lugar de la*
Posible primera línea de cada script / sesión de Bash:
Utilice, por ejemplo:
Puede considerar:
echo
interpreta-e
como opción aquífuente
Bucle de línea única,
obtendrás una salida como esta,
fuente
Lo que realmente necesitaba para esto era algo como esto:
Por ejemplo:
(Mataría todos los procesos con vlc en su nombre)
fuente
Recorro una variedad de mis proyectos para una
git pull
actualización:fuente