Câu trả lời:
ARGS="-a -b -c"
grep -- "$ARGS"
grep -- "--name awesome"
.
Dấu gạch ngang là một ký tự đặc biệt trong Bash như được ghi chú tại http://tldp.org/LDP/abs/html/special-chars.html#DASHREF . Vì vậy, thoát khỏi điều này một lần giúp bạn vượt qua Bash, nhưng Grep vẫn có ý nghĩa riêng với dấu gạch ngang (bằng cách cung cấp tùy chọn).
Vì vậy, bạn thực sự cần phải thoát nó hai lần (nếu bạn không muốn sử dụng các câu trả lời được đề cập khác). Sau đây sẽ / nên làm việc
grep \\-X
grep '\-X'
grep "\-X"
Một cách để thử cách Bash chuyển các đối số cho một tập lệnh / chương trình là tạo một tập lệnh .sh chỉ lặp lại tất cả các đối số. Thỉnh thoảng tôi sử dụng một tập lệnh có tên là echo-args.sh để chơi, tất cả những gì nó chứa là:
echo $*
Tôi gọi nó là:
bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"
Bạn có được ý tưởng.
grep -e -X
sẽ thực hiện các mẹo.
-P
(nhưng đó là một câu chuyện khác và không áp dụng ở đây)).
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X
Cách chính xác sẽ là sử dụng "-" để dừng xử lý các đối số, như đã đề cập. Điều này là do việc sử dụng getopt_long (hàm GNU C từ getopt.h) trong nguồn của công cụ.
Đây là lý do tại sao bạn nhận thấy các hiện tượng tương tự trên các công cụ dòng lệnh khác; vì hầu hết trong số chúng là các công cụ GNU và sử dụng lệnh gọi này, chúng thể hiện hành vi tương tự.
Như một lưu ý phụ - getopt_long là thứ mang đến cho chúng ta sự lựa chọn tuyệt vời giữa -rlo và --really_long_option và sự kết hợp các đối số trong trình thông dịch.
bạn có thể sử dụng nawk
$ nawk '/-X/{print}' file
ls -l | grep "^-"
Hy vọng điều này sẽ phục vụ mục đích của bạn.
tập tin grep "^ -X"
Nó sẽ grep và chọn tất cả các dòng tạo thành tập tin. ^ trong grep "^" chỉ ra một dòng bắt đầu bằng
-
, không phải các dòng.
--
có nghĩa là gì hoặc không: unix.stackexchange.com/questions/11376/ Ấn