Làm cách nào để sử dụng so sánh tệp grep trong câu lệnh bash if / other?


138

Khi máy chủ của chúng tôi xuất hiện, chúng tôi cần kiểm tra một tệp để xem máy chủ được cấu hình như thế nào.

Chúng tôi muốn tìm kiếm chuỗi sau trong tệp /etc/aws/hosts.conf của chúng tôi:

MYSQL_ROLE=master

Sau đó, chúng tôi muốn kiểm tra xem chuỗi đó có tồn tại hay không và sử dụng câu lệnh if / other để chạy một trong hai tùy chọn tùy thuộc vào việc chuỗi có tồn tại hay không.

Cú pháp BASH cho câu lệnh if là gì?

if [ ????? ]; then
  #do one thing
else
  #do another thing
fi

Câu trả lời:


205

Từ grep --help, nhưng cũng thấy người đàn ông grep :

Trạng thái thoát là 0 nếu bất kỳ dòng nào được chọn, 1 nếu không; nếu có lỗi xảy ra và -q không được đưa ra, trạng thái thoát là 2.

if grep --quiet MYSQL_ROLE=master /etc/aws/hosts.conf; then
  echo exists
else
  echo not found
fi

Bạn có thể muốn sử dụng một biểu thức chính cụ thể hơn, chẳng hạn như ^MYSQL_ROLE=master$để tránh chuỗi đó trong các nhận xét, tên chỉ bắt đầu bằng "chính", v.v.

Điều này hoạt động bởi vì if lấy một lệnh và chạy nó, và sử dụng giá trị trả về của lệnh đó để quyết định cách tiến hành, với ý nghĩa không đúng và không có nghĩa là sai, giống như cách các mã trả về khác được giải thích bởi shell, và đối lập với một ngôn ngữ như C.


> với số 0 có nghĩa là đúng và khác không có nghĩa là sai, giống như cách các mã trả về khác được giải thích bởi shell và ngược lại với ngôn ngữ như C. nhưng tại sao lại ngược lại ....?
kchoi

Bởi vì số 0 thường được hiểu là "không có lỗi", trong khi mọi thứ khác có nghĩa là "một số lỗi". Nếu giả sử chúng ta muốn biết nếu lệnh hoàn thành thành công.
timelmer

33

ifnhận một lệnh và kiểm tra giá trị trả về của nó. [chỉ là một mệnh lệnh.

if grep -q ...
then
  ....
else
  ....
fi

23

Lưu ý rằng, vì PIPElà bất kỳ lệnh hoặc chuỗi lệnh nào, sau đó:

if PIPE ; then
  # do one thing if PIPE returned with zero status ($?=0)
else 
  # do another thing if PIPE returned with non-zero status ($?!=0), e.g. error
fi 

Đối với hồ sơ, [ expr ]là một vỏ BUILTIN viết tắt cho test expr.

greptrả về với trạng thái 0 trong trường hợp khớp và trạng thái khác không trong trường hợp không khớp, bạn có thể sử dụng:

if grep -lq '^MYSQL_ROLE=master' ; then 
  # do one thing 
else 
  # do another thing
fi 

Lưu ý việc sử dụng -lchỉ quan tâm đến tệp có ít nhất một kết quả khớp (để greptrả về ngay khi tìm thấy một kết quả khớp mà không cần tiếp tục phân tích tệp đầu vào.)

trên một số nền tảng [ expr ]không phải là một dựng sẵn, nhưng một thực thi thực tế /bin/[(mà tranh luận cuối cùng sẽ được ]), đó là lý do tại sao [ expr ]nên chứa khoảng trống xung quanh dấu ngoặc vuông, và tại sao nó phải được theo sau bởi một trong những dải phân cách danh sách lệnh ( ;, &&, ||, |, &, dòng mới)


4
-llà không cần thiết, greptrả lại ngay lập tức khi tìm thấy bất kỳ trận đấu nào với-q
Phục hồi Monica Vui lòng vào

3

chỉ sử dụng bash

while read -r line
do
  case "$line" in
    *MYSQL_ROLE=master*)
       echo "do your stuff";;
    *) echo "doesn't exist";;      
  esac
done <"/etc/aws/hosts.conf"
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.