Bash phân tích cú pháp đối số với dấu ngoặc kép


8

Vui lòng xem xét kịch bản đơn giản có tên thử nghiệm này :

#!/bin/bash
echo $1

và các lệnh và lệnh sau:

$ echo "A B"
A B
$ echo ""A B""
A B
$ echo """A B"""
A B
$ echo """A B"""
A B

$ ./test "A B"
A B
$ ./test ""A B""
A
$ ./test """A B"""
A B
$ ./test """"A B""""
A

Ai đó có thể vui lòng giải thích lý do tại sao lệnh gọi kiểm tra không hoạt động như tiếng vang của lệnh hoặc trỏ đến tài liệu liên quan không?


2
Đã có một lệnh kiểm tra , bạn thật may mắn khi bạn đang sử dụng đường dẫn đầy đủ, nếu không bạn sẽ gặp khó khăn trong việc gỡ lỗi tình huống.
Rui F Ribeiro

3
Tốt hơn cho loại thử nghiệm này là sử dụng printf '%q\n' "$@"thay vì hoàn echotoàn, nó sẽ phát ra các đối số của bạn một dòng với các ký tự ẩn và khoảng trắng được thoát trong một hình thức có thể nhìn thấy.
Charles Duffy

Câu trả lời:


13

Bởi vì echoghép tất cả các đối số để in chúng và tập lệnh của bạn bị giới hạn ở đối số đầu tiên . Bạn nên sử dụng "$@"và không có $1trong kịch bản của bạn.

Hãy xem xét các đối số bạn cung cấp cho bài kiểm tra của mình:

  • ./test "A B"
    • một đối số, chuỗi 3 ký tự AspaceB
  • ./test ""A B""
    • hai đối số
      • đầu tiên, empty stringnối vớiA
      • thứ hai, Bnối vớiempty string
  • ./test """A B"""
    • một đối số, được empty stringnối với AspaceBnốiempty string
  • ./test """"A B""""
    • hai đối số
      • đầu tiên, empty stringnối với empty stringnốiA
      • thứ hai, Bnối với empty stringnối vớiempty string

Lưu ý: bạn sẽ thấy các kết quả khác nhau echonếu bạn đã sử dụng nhiều hơn một khoảng trắng trong các đối số của mình. Đó là bởi vì echo kết hợp các đối số của nó với một khoảng trắng:

$ echo "A   B"
A   B
$ echo ""A   B""
A B
$ echo """A   B"""
A   B
$ echo """"A   B""""
A B

đó là những hình tượng trưng chuỗi nhỏ gọn gàng .
mikeerv 8/12/2015

2
chính xác, trích dẫn không làm tổ ...
mr.spuratic 8/12/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.