2012-05-13 45 views
8

Tôi đang viết tập lệnh bash (hy vọng) chuyển hướng đến tệp có tên được tạo động, dựa trên đối số đầu tiên được đặt cho tập lệnh, được thêm vào chuỗi ký tự. Tên của tập lệnh là ./buildcsvs.Chuyển hướng đầu ra bash sang tên tệp động

Đây là những gì mã trông giống như bây giờ, nếu không có sự tên tập tin năng động

#!/bin/bash 
mdb-export 2011ROXBURY.mdb TEAM > team.csv 

Đây là cách tôi muốn nó đi ra

./buildcsvs roxbury 

nên sản lượng

roxburyteam.csv 

với "$ 1" là arg đầu tiên cho tập lệnh, trong đó tên tệp được xác định bởi một cái gì đó giống như một cái gì đó như

"%steam" % $1 

Bạn có ý tưởng nào không? Cảm ơn bạn

Trả lời

11

Chỉ cần ghép nối $ 1 với "team.csv".

#!/bin/bash 
mdb-export 2011ROXBURY.mdb TEAM > "${1}team.csv" 

Trong trường hợp đó họ không vượt qua một cuộc tranh cãi với kịch bản, nó sẽ viết thư cho "team.csv"

+1

bạn là một vị thần. cảm ơn bạn! – mythander889

2

Bạn có thể tham khảo một đối số vị trí để một kịch bản shell qua $1 hoặc một cái gì đó tương tự . Tôi đã viết kịch bản thử nghiệm nhỏ sau đây để chứng minh làm thế nào nó được thực hiện:

$ cat buildcsv 
#!/bin/bash 
echo foo > $1.csv 
$ ./buildcsv roxbury 
$ ./buildcsv sarnold 
$ ls -l roxbury.csv sarnold.csv 
-rw-rw-r-- 1 sarnold sarnold 4 May 12 17:32 roxbury.csv 
-rw-rw-r-- 1 sarnold sarnold 4 May 12 17:32 sarnold.csv 

Hãy thử thay thế team.csv với $1.csv.

Lưu ý rằng việc chạy tập lệnh mà không có đối số sẽ tạo một tệp trống có tên .csv. Nếu bạn muốn xử lý điều đó, bạn sẽ phải đếm số lượng đối số bằng cách sử dụng $#. Tôi cũng đã tấn công cùng nhau:

$ cat buildcsv 
#!/bin/bash 
(($# != 1)) && echo Need an argument && exit 1 
echo foo > $1.csv 
+0

Trong bash, thường tốt hơn để sử dụng (()) cho so sánh số. '(($ # < 1 || $# > 1)) && ...'. – jordanm

+0

@jordanm: điểm tốt, cố định. Cảm ơn. – sarnold

+1

'(($ #! = 1)) && ...' là đơn giản hơn. –

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