หนึ่งจะแยกสถานะการออกของคำสั่งลงในตัวแปรได้อย่างไร


14

ฉันเริ่มเรียนรู้การทุบตีเมื่อสองสามวันก่อน

ฉันพยายามรับสถานะทางออกของgrepการแสดงออกเป็นตัวแปรเช่นนี้

check=grep -ci 'text' file.sh

และผลลัพธ์ที่ฉันได้รับคือ

No command '-ic' found

ฉันควรทำด้วยคำสั่งไพพ์หรือไม่?


6
สำหรับสถานะออกคุณสามารถตรวจสอบได้$?ทันทีหลังจากคำสั่งเสร็จสิ้น
coffeMug

และคุณสามารถตรวจสอบอาร์เรย์ PIPESTATUS หากคุณต้องการสถานะของหนึ่งในคำสั่งในขั้นตอน
cas

คำตอบ:


26

คำสั่งของคุณ

check=grep -ci 'text' file.sh

จะถูกตีความโดยเชลล์เป็น "เรียกใช้คำสั่ง-ciด้วยอาร์กิวเมนต์textและfile.shและตั้งค่าตัวแปรcheckเป็นค่าgrepในสภาพแวดล้อมของมัน"


เปลือกเก็บค่าทางออกของคำสั่งดำเนินการเมื่อเร็ว ๆ ?นี้มากที่สุดในตัวแปร คุณสามารถกำหนดค่าให้กับหนึ่งในตัวแปรของคุณเองเช่นนี้:

grep -i 'PATTERN' file
check=$?

หากคุณต้องการดำเนินการกับค่านี้คุณสามารถใช้checkตัวแปรของคุณ:

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

หรือคุณสามารถข้ามโดยใช้ตัวแปรแยกต่างหากและต้องตรวจสอบ$?ทั้งหมด:

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

(โปรดสังเกต-qว่ามันแนะนำgrepให้ไม่ส่งออกสิ่งใดและเพื่อออกจากทันทีที่พบสิ่งที่ตรงกันเราไม่สนใจจริงๆในสิ่งที่ตรงกับที่นี่)

หรือหากคุณต้องการ "ทำสิ่งต่าง ๆ " เมื่อไม่พบรูปแบบ:

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

การบันทึก$?ลงในตัวแปรอื่นนั้นจำเป็นเฉพาะเมื่อคุณจำเป็นต้องใช้ในภายหลังเมื่อค่าใน$?ถูกเขียนทับเช่นเดียวกับใน

mkdir "$dir"
err=$?

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

ในตัวอย่างโค้ดข้างต้น$?จะถูกเขียนทับโดยผลลัพธ์ของการ[ "$err" -ne 0 ] && [ ! -d "$dir" ]ทดสอบ exitออมทรัพย์ได้ที่นี่เป็นสิ่งที่จำเป็นจริงๆเท่านั้นถ้าเราต้องการแสดงและใช้งานได้ด้วย


4

คำถามของคุณไม่ชัดเจน แต่ขึ้นอยู่กับรหัสที่คุณส่งดูเหมือนว่าคุณต้องการให้ตัวแปรcheckเก็บสถานะการออกของgrepคำสั่ง วิธีการทำเช่นนี้คือการทำงาน

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

$?เมื่อเรียกใช้คำสั่งจากเปลือกออกจากสถานะของมันจะทำผ่านพารามิเตอร์เปลือกพิเศษ

นี้เป็นเอกสารโดย POSIX (มาตรฐานสำหรับ Unix เหมือนระบบปฏิบัติการ) ในของข้อกำหนดสำหรับเปลือกและการดำเนินการทุบตีเป็นเอกสารภายใต้พารามิเตอร์พิเศษ

เนื่องจากคุณเป็นผู้เรียนใหม่ฉันขอแนะนำให้คุณเริ่มต้นด้วยหนังสือดีๆและ / หรือบทช่วยสอนออนไลน์เพื่อรับข้อมูลพื้นฐาน คำแนะนำของทรัพยากรภายนอกมีกำลังใจในเว็บไซต์กองแลกเปลี่ยน แต่ผมขอแนะนำให้Lhunath และ GreyCat คู่มือทุบตี


4

คุณบอกให้ทุบตีเพื่อตั้งค่าตัวแปรcheck=grepในสภาพแวดล้อมที่มันผ่านไปยังคำสั่ง

-ci 'text' file.sh

แต่ciไม่มีอยู่จริง

ฉันเชื่อว่าคุณหมายถึงการปิดคำสั่งนั้นในเครื่องหมายขีดหลังหรือในวงเล็บนำหน้าด้วยเครื่องหมายดอลลาร์ซึ่งทั้งสองอย่างนี้จะกำหนดจำนวนของข้อความ 'บรรทัด' ที่พบในกรณี (ในกรณีที่ไม่มีความรู้สึก) ในไฟล์:

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

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

ตอนนี้$checkควรเป็น 0 ถ้าไม่มีการแข่งขันหรือบวกถ้ามีการแข่งขันใด ๆ


1

สับสนทำไมใช้ -c เมื่อตรวจสอบผลลัพธ์ มันถูกใช้เพื่อตรวจสอบว่ามีบางสิ่งที่ตรงกันหลายครั้ง - ไม่ว่าจะประสบความสำเร็จหรือไม่

   -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.)

แต่ในตัวอย่างนี้

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

มันจะไม่ส่งออกอะไรเลยนอกจากรหัสออกซึ่งสะท้อนแล้ว นี่คือผลลัพธ์ที่การตรวจสอบตัวแปรใช้ ฉันชอบมันเพราะมันเป็นบรรทัดเดียว

คุณสามารถแทนที่ --silent ด้วย -q ฉันใช้มันเพราะคุณไม่ได้สนใจผลลัพธ์ grep ไม่ว่าจะทำงานหรือไม่ก็ตาม

   -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

วิธีที่ถูกต้องในการกำหนดเอาต์พุตของคำสั่ง grep ให้กับตัวแปรคือ @ monty-hard ที่กล่าวถึง:

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

แม้ว่าจะกำหนดสถานะการออกของคำสั่งนี้ให้กับตัวแปรคุณต้องใช้พารามิเตอร์ shell $?ทันทีหลังจากดำเนินการคำสั่งตามที่แสดงด้านล่าง:

grep -ci 'text' file.sh
check=$?
echo $check
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.