ฉันเริ่มเรียนรู้การทุบตีเมื่อสองสามวันก่อน
ฉันพยายามรับสถานะทางออกของgrep
การแสดงออกเป็นตัวแปรเช่นนี้
check=grep -ci 'text' file.sh
และผลลัพธ์ที่ฉันได้รับคือ
No command '-ic' found
ฉันควรทำด้วยคำสั่งไพพ์หรือไม่?
ฉันเริ่มเรียนรู้การทุบตีเมื่อสองสามวันก่อน
ฉันพยายามรับสถานะทางออกของgrep
การแสดงออกเป็นตัวแปรเช่นนี้
check=grep -ci 'text' file.sh
และผลลัพธ์ที่ฉันได้รับคือ
No command '-ic' found
ฉันควรทำด้วยคำสั่งไพพ์หรือไม่?
คำตอบ:
คำสั่งของคุณ
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
ออมทรัพย์ได้ที่นี่เป็นสิ่งที่จำเป็นจริงๆเท่านั้นถ้าเราต้องการแสดงและใช้งานได้ด้วย
คำถามของคุณไม่ชัดเจน แต่ขึ้นอยู่กับรหัสที่คุณส่งดูเหมือนว่าคุณต้องการให้ตัวแปรcheck
เก็บสถานะการออกของgrep
คำสั่ง วิธีการทำเช่นนี้คือการทำงาน
grep -ci 'text' file.sh
check=$?
$?
เมื่อเรียกใช้คำสั่งจากเปลือกออกจากสถานะของมันจะทำผ่านพารามิเตอร์เปลือกพิเศษ
นี้เป็นเอกสารโดย POSIX (มาตรฐานสำหรับ Unix เหมือนระบบปฏิบัติการ) ในของข้อกำหนดสำหรับเปลือกและการดำเนินการทุบตีเป็นเอกสารภายใต้พารามิเตอร์พิเศษ
เนื่องจากคุณเป็นผู้เรียนใหม่ฉันขอแนะนำให้คุณเริ่มต้นด้วยหนังสือดีๆและ / หรือบทช่วยสอนออนไลน์เพื่อรับข้อมูลพื้นฐาน คำแนะนำของทรัพยากรภายนอกมีกำลังใจในเว็บไซต์กองแลกเปลี่ยน แต่ผมขอแนะนำให้Lhunath และ GreyCat คู่มือทุบตี
คุณบอกให้ทุบตีเพื่อตั้งค่าตัวแปรcheck=grep
ในสภาพแวดล้อมที่มันผ่านไปยังคำสั่ง
-ci 'text' file.sh
แต่ci
ไม่มีอยู่จริง
ฉันเชื่อว่าคุณหมายถึงการปิดคำสั่งนั้นในเครื่องหมายขีดหลังหรือในวงเล็บนำหน้าด้วยเครื่องหมายดอลลาร์ซึ่งทั้งสองอย่างนี้จะกำหนดจำนวนของข้อความ 'บรรทัด' ที่พบในกรณี (ในกรณีที่ไม่มีความรู้สึก) ในไฟล์:
check=`grep -ci 'text' file.sh`
check=$(grep -ci 'text' file.sh)
ตอนนี้$check
ควรเป็น 0 ถ้าไม่มีการแข่งขันหรือบวกถ้ามีการแข่งขันใด ๆ
สับสนทำไมใช้ -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
วิธีที่ถูกต้องในการกำหนดเอาต์พุตของคำสั่ง grep ให้กับตัวแปรคือ @ monty-hard ที่กล่าวถึง:
check=`grep -ci 'text' file.sh`
check=$(grep -ci 'text' file.sh)
แม้ว่าจะกำหนดสถานะการออกของคำสั่งนี้ให้กับตัวแปรคุณต้องใช้พารามิเตอร์ shell $?
ทันทีหลังจากดำเนินการคำสั่งตามที่แสดงด้านล่าง:
grep -ci 'text' file.sh
check=$?
echo $check
$?
ทันทีหลังจากคำสั่งเสร็จสิ้น