2009-11-20 12 views
6

Gdzie się mylę?Jak iterować parametry pozycyjne w skrypcie Bash?

Mam kilka plików w następujący sposób:

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

mijam tau, xhpl, fft, mpi_tile_io i PMB_MPI jako parametry pozycyjne do skryptu w następujący sposób:

./script.sh tau xhpl mpi_tile_io fft PMB_MPI 

chcę grep do wyszukiwania wewnątrz pętla, najpierw przeszukiwanie tau, xhpl itd.

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

Jaką skryptu? –

+0

skrypt bash .. przepraszam, zapomniałem o tym wspomnieć –

+0

pamiętaj, aby umieścić takie rzeczy w tagach, to sprawia, że ​​pytanie jest łatwiejsze do znalezienia dla odbiorców docelowych, np. ludzie, którzy odfiltrowali skrypty basha jako interesujący tag. –

Odpowiedz

6

Skonfiguruj pętlę for w ten sposób. Dzięki tej składni pętla przechodzi przez kolejne parametry pozycyjne, przypisując każdemu po kolei "punkt".

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

Sugeruję cytowanie wokół argumentu filename, aby uniknąć kłopotów ze spacjami. –

+0

Myślę, że brakuje Ci zadania takiego jak 'point =" $ @ "'. –

+0

Aaron, dobry punkt. Skopiowałem/wkleiłem tę linię z pytania bez edytowania. Dennis, to nie jest poprawne. Nie ma potrzeby przypisywania bezpośrednio do punktu. Zobacz sekcję "Polecenia złożone" w instrukcji obsługi Bash, aby uzyskać wszystkie szczegóły. –

2

Zobacz here, musisz przejść do krok po kroku przez parametry pozycyjne.

1

Spróbuj czegoś takiego:

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

Jest więcej niż jeden sposób, aby to zrobić, a jednocześnie chciałbym użyć shift, oto kolejny dla odmiany. Używa funkcji pośredniej Bash:

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

Zaletą tej metody jest możliwość uruchamiania i zatrzymywania pętli w dowolnym miejscu. Zakładając, że masz już zatwierdzone zakres, można zrobić coś takiego:

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

Ponadto, jeśli chcesz ostatniego param: ${!#}

+0

Niezły dodatek Dennis - właśnie to, czego teraz potrzebuję – joelparkerhenderson

Powiązane problemy