2009-05-08 16 views
13

Giả sử tôi có tập lệnh bash có tên foo.sh.Giống như lưu trữ tất cả đối số dòng lệnh vào tập lệnh bash thành một biến duy nhất

tôi muốn gọi nó như thế này

foo.sh Here is a bunch of stuff on the command-line 

và tôi muốn nó để lưu trữ tất cả các văn bản đó vào một biến duy nhất và in nó ra.

Vì vậy, đầu ra của tôi sẽ là:

Here is a bunch of stuff on the command-line 

Làm thế nào tôi sẽ làm điều này?

Trả lời

27
echo "$*" 

sẽ làm những gì bạn muốn, cụ thể là in ra toàn bộ đối số dòng lệnh, cách nhau bằng một dấu cách (hoặc, về mặt kỹ thuật, bất kể giá trị của $IFS là). Nếu bạn muốn lưu trữ nó vào một biến, bạn có thể làm

thevar="$*" 

Nếu điều đó không trả lời câu hỏi của bạn cũng đủ, tôi không biết phải nói gì nữa nhỉ ...

0

Có một cái nhìn tại biến số $*. Nó kết hợp tất cả các đối số dòng lệnh thành một.

echo "$*" 

Điều này sẽ làm những gì bạn muốn.

More info here.

24

Nếu bạn muốn tránh có $ IFS liên quan, sử dụng $ @ (hoặc không kèm theo $ * trong dấu ngoặc kép)

$ cat atsplat 
IFS="_" 
echo "  at: [email protected]" 
echo " splat: $*" 
echo "noquote: "$* 

$ ./atsplat this is a test 
    at: this is a test 
    splat: this_is_a_test 
noquote: this is a test 

Các hành vi IFS sau bài tập biến, quá.

$ cat atsplat2 
IFS="_" 
[email protected] 
splatvar=$* 
echo "  at: $atvar" 
echo " splat: $splatvar" 
echo "noquote: "$splatvar 

$ ./atsplat2 this is a test 
    at: this is a test 
    splat: this_is_a_test 
noquote: this is a test 

Lưu ý rằng nếu việc chuyển nhượng đến $ IFS được thực hiện sau khi việc chuyển nhượng $ splatvar, sau đó tất cả các kết quả đầu ra sẽ là như nhau ($ IFS sẽ không có hiệu lực trong "atsplat2" chẳng hạn).