Làm thế nào để trích xuất trạng thái thoát lệnh của một biến thành một biến?


14

Tôi bắt đầu học Bash vài ngày trước.

Tôi đang cố gắng để có được trạng thái thoát grepbiểu thức thành một biến như thế này:

check=grep -ci 'text' file.sh

và đầu ra mà tôi nhận được là

No command '-ic' found

Tôi có nên làm điều đó với một lệnh ống?


6
Đối với trạng thái thoát bạn có thể kiểm tra $?ngay sau khi lệnh kết thúc.
coffeMug

và bạn có thể kiểm tra mảng PIPESTATUS nếu bạn muốn trạng thái của một trong các lệnh trong một đường ống dẫn.
cas

Câu trả lời:


26

Lệnh của bạn,

check=grep -ci 'text' file.sh

sẽ được giải thích bằng vỏ là "chạy lệnh -civới các đối số textfile.shvà đặt biến checkvới giá trị greptrong môi trường của nó".


Shell lưu trữ giá trị thoát của lệnh được thực hiện gần đây nhất trong biến ?. Bạn có thể gán giá trị của nó cho một trong các biến của riêng bạn như thế này:

grep -i 'PATTERN' file
check=$?

Nếu bạn muốn hành động theo giá trị này, bạn có thể sử dụng checkbiến của mình :

if [ "$check" -eq 0 ]; then
    # do things for success
else
    # do other things for failure
fi

hoặc bạn có thể bỏ qua việc sử dụng một biến riêng biệt và phải kiểm tra $?tất cả cùng nhau:

if grep -q -i 'pattern' file; then
  # do things (pattern was found)
else
  # do other things (pattern was not found)
fi

(lưu ý rằng -q, nó hướng dẫn grepkhông xuất bất cứ thứ gì và thoát ra ngay khi có thứ gì đó phù hợp; chúng tôi không thực sự quan tâm đến những gì phù hợp ở đây)

Hoặc, nếu bạn chỉ muốn "làm mọi thứ" khi không tìm thấy mẫu:

if ! grep -q -i 'pattern' file; then
  # do things (pattern was not found)
fi

Lưu $?vào một biến khác chỉ cần thiết nếu bạn cần sử dụng nó sau này, khi giá trị trong $?đã bị ghi đè, như trong

mkdir "$dir"
err=$?

if [ "$err" -ne 0 ] && [ ! -d "$dir" ]; then
    printf 'Error creating %s (error code %d)\n' "$dir" "$err" >&2
    exit "$err"
fi

Trong đoạn mã trên, $?sẽ được ghi đè bằng kết quả của [ "$err" -ne 0 ] && [ ! -d "$dir" ]bài kiểm tra. Lưu nó ở đây thực sự chỉ cần thiết nếu chúng ta cần hiển thị và sử dụng nó với exit.


4

Câu hỏi của bạn không rõ ràng nhưng dựa trên mã bạn đã gửi, có vẻ như bạn muốn biến checklưu trữ trạng thái thoát của greplệnh. Cách để làm điều này là chạy

grep -ci 'text' file.sh
check=$?

Khi chạy lệnh từ shell, trạng thái thoát của nó được cung cấp thông qua tham số shell đặc biệt , $?.

Điều này được POSIX (tiêu chuẩn cho các hệ điều hành giống Unix) ghi lại trong đặc tả của nó cho trình bao và việc triển khai Bash được ghi lại trong Thông số đặc biệt .

Vì bạn là người mới học, tôi thực sự khuyên bạn nên bắt đầu với một cuốn sách hay và / hoặc hướng dẫn trực tuyến để có được những điều cơ bản. Các khuyến nghị về tài nguyên bên ngoài không được khuyến khích trên các trang web Stack Exchange nhưng tôi đề xuất Hướng dẫn Bash của Lhunath và GreyCat .


4

Bạn đã bảo bash đặt biến check=greptrong môi trường mà nó chuyển đến lệnh

-ci 'text' file.sh

nhưng cikhông tồn tại

Tôi tin rằng bạn có nghĩa là gửi kèm lệnh đó trong dấu tick ngược hoặc trong ngoặc đơn đứng trước ký hiệu đô la, một trong hai sẽ gán số lượng 'văn bản' được tìm thấy trên (trường hợp không nhạy cảm) trong tệp:

check=`grep -ci 'text' file.sh`

check=$(grep -ci 'text' file.sh)

Bây giờ $checksẽ là 0 nếu không có trận đấu, hoặc tích cực nếu có bất kỳ trận đấu nào.


1

Nhầm lẫn tại sao sử dụng -c khi kiểm tra đầu ra? Nó được sử dụng để kiểm tra số lần một cái gì đó được khớp - không phải là nó có thành công hay không.

   -c, --count
          Suppress normal output; instead print a count of matching  lines
          for  each  input  file.  With the -v, --invert-match option (see
          below), count non-matching lines.  (-c is specified by POSIX.)

nhưng trong ví dụ này

check="$(grep --silent -i 'text' file.sh; echo $?)"

Nó không xuất ra bất cứ thứ gì ngoại trừ mã thoát, sau đó được lặp lại. Đây là đầu ra mà kiểm tra biến sử dụng. Tôi cũng thích nó vì nó là một dòng duy nhất.

Bạn có thể thay thế --silent bằng -q. Tôi sử dụng nó vì bạn không quan tâm đến đầu ra grep, chỉ là nó có hoạt động hay không.

   -q, --quiet, --silent
          Quiet;  do  not  write  anything  to  standard   output.    Exit
          immediately  with  zero status if any match is found, even if an
          error was detected.  Also see the -s  or  --no-messages  option.
          (-q is specified by POSIX.)

$ check=$(echo test | grep -qi test; echo $?) # check variable is now set
$ echo $check
0
$ check=$(echo null | grep -qi test; echo $?)
$ echo $check
1

1

Cách chính xác để gán đầu ra của lệnh grep cho một biến là như @ monty-Hard đề cập:

check=`grep -ci 'text' file.sh`
check=$(grep -ci 'text' file.sh)

Mặc dù để gán trạng thái thoát của lệnh này cho một biến, bạn phải sử dụng tham số shell $?ngay sau khi thực hiện lệnh như dưới đây:

grep -ci 'text' file.sh
check=$?
echo $check
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.