2009-11-20 11 views
6

¿Dónde me estoy equivocando?¿Cómo iterar sobre los parámetros posicionales en un script Bash?

Tengo algunos archivos de la siguiente manera:

filename_tau.txt 
filename_xhpl.txt 
fiename_fft.txt 
filename_PMB_MPI.txt 
filename_mpi_tile_io.txt 

que pase tau, xhpl, fft, mpi_tile_io y PMB_MPI como parámetros posicionales a la escritura de la siguiente manera:

./script.sh tau xhpl mpi_tile_io fft PMB_MPI 

Quiero grep para buscar en el interior un bucle, primero buscando tau, xhpl y así sucesivamente ..

point=$1  #initially points to first parameter 
i="0" 
while [$i -le 4] 
do 
    grep "$str" ${filename}${point}.txt 
    i=$[$i+1] 
    point=$i  #increment count to point to next positional parameter 
done 
+0

¿Qué tipo de guión? –

+0

script bash ... lo siento, olvidé mencionarlo –

+0

recuerde poner cosas así en las etiquetas, hace que la pregunta sea más fácil de encontrar para su público objetivo, es decir. las personas que han filtrado scripts bash como una etiqueta interesante. –

Respuesta

6

Configure su bucle for de esta manera. Con esta sintaxis, el ciclo itera sobre los parámetros de posición, asignando cada uno a 'punto' por turno.

for point; do 
    grep "$str" ${filename}${point}.txt 
done 
+2

Sugiero comillas alrededor del argumento del nombre del archivo para evitar problemas con los espacios. –

+0

Creo que te estás perdiendo una tarea como 'point =" $ @ "'. –

+0

Aaron, buen punto. Copié/pegué esa línea de la pregunta sin editarla. Dennis, eso no es correcto. No hay necesidad de asignar al punto directamente. Consulte la sección "Comandos compuestos" del manual de Bash para obtener todos los detalles. –

2

Consulte here, necesita cambiar para pasar por los parámetros posicionales.

1

intentar algo como esto:

# Iterating through the provided arguments 
for ARG in $*; do 
    if [ -f filename_$ARG.txt]; then 
     grep "$str" filename_$ARG.txt 
    fi 
done 
3

Hay más de una manera de hacer esto y, aunque me gustaría utilizar shift, aquí es otra variedad. Se utiliza la función indirecta de Bash:

#!/bin/bash 
for ((i=1; i<=$#; i++)) 
do 
    grep "$str" ${filename}${!i}.txt 
done 

Una ventaja de este método es que se puede iniciar y detener el bucle en cualquier lugar. Suponiendo que haya validado la gama, se podría hacer algo como:

for ((i=2; i<=$# - 1; i++)) 

Además, si desea que el último parámetro: ${!#}

+0

Agradable además Dennis - justo lo que necesito ahora – joelparkerhenderson

Cuestiones relacionadas