2009-11-20 35 views
6

Tôi đang đi sai ở đâu?Làm thế nào để lặp qua các tham số vị trí trong một kịch bản Bash?

Tôi có một số file như sau:

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

tôi vượt qua tau, xhpl, fft, mpi_tile_ioPMB_MPI như tham số vị trí để kịch bản như sau:

./script.sh tau xhpl mpi_tile_io fft PMB_MPI 

Tôi muốn grep để tìm kiếm bên trong một vòng lặp, đầu tiên tìm kiếm tau, xhpl và vv ..

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

Những loại kịch bản? –

+0

bash script .. xin lỗi tôi quên đề cập đến nó –

+0

hãy nhớ để đặt những thứ như thế vào thẻ, nó làm cho câu hỏi dễ dàng hơn để tìm cho đối tượng mục tiêu của bạn, tức là. những người đã lọc ra các tập lệnh bash dưới dạng một thẻ thú vị. –

Trả lời

6

Thiết lập vòng lặp cho bạn như thế này. Với cú pháp này, vòng lặp lặp qua các tham số vị trí, lần lượt gán một tham số cho 'điểm'.

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

Tôi đề xuất các trích dẫn xung quanh đối số tên tệp để tránh sự cố với không gian. –

+0

Tôi nghĩ bạn đang thiếu một bài tập như 'point =" $ @ "'. –

+0

Aaron, điểm tốt. Tôi sao chép/dán dòng đó từ câu hỏi mà không chỉnh sửa nó. Dennis, điều đó không đúng. Không cần phải gán trực tiếp điểm. Xem phần "Các lệnh ghép" trong sổ tay Bash để biết tất cả các chi tiết. –

2

Xem here, bạn cần chuyển qua từng bước thông số vị trí.

1

Hãy thử một cái gì đó như thế này:

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

Có nhiều hơn một cách để làm điều này và, trong khi tôi sẽ sử dụng shift, đây là khác với nhiều. Nó sử dụng tính năng gián tiếp Bash:

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

Một lợi thế cho phương pháp này là bạn có thể bắt đầu và ngừng vòng lặp của bạn bất cứ nơi nào. Giả sử bạn đã xác nhận phạm vi, bạn có thể làm một cái gì đó như:

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

Ngoài ra, nếu bạn muốn param lần cuối: ${!#}

+0

Dennis đẹp - chỉ là những gì tôi cần bây giờ – joelparkerhenderson

Các vấn đề liên quan