ปฏิเสธว่าเงื่อนไขในสคริปต์ทุบตี


162

ฉันใหม่เพื่อทุบตีและฉันพยายามที่จะปฏิเสธคำสั่งต่อไปนี้:

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
        echo "Sorry you are Offline"
        exit 1

ถ้าเงื่อนไขนี้คืนจริงถ้าฉันเชื่อมต่อกับอินเทอร์เน็ต ฉันต้องการให้มันเกิดขึ้นในแบบอื่น ๆ แต่การวาง!ที่ใดก็ได้ดูเหมือนจะไม่ทำงาน


3
คุณวางไว้ที่ไหน if ! [[ ...ทำงานได้
ผู้ชายคนอื่น

1
คุณสามารถใช้วิธีนี้ได้: wget your_xxxx_params || (echo "oh oh" && ทางออก 1)
AKS

2
> เรียก subshell เพียงเพื่อแสดงข้อผิดพลาด
tijagi

คำตอบ:


227

คุณสามารถเลือก:

if [[ $? -ne 0 ]]; then       # -ne: not equal

if ! [[ $? -eq 0 ]]; then     # -eq: equal

if [[ ! $? -eq 0 ]]; then

! กลับการกลับมาของการแสดงออกต่อไปนี้ตามลำดับ


9
จำเป็นต้องใช้วงเล็บสองตัวหรือไม่ ทำไมถึงเป็นอย่างนั้น?
Alexander Mills

1
@AlexanderMills: มีหลายวิธีในการทำเช่นนี้ ด้วยวงเล็บใหญ่หรือคู่หรือtestคำสั่ง:if test $? -ne 0; then
Cyrus

4
คำตอบนี้เป็น verbose ที่ไม่จำเป็น ifคาดหวังคำสั่งที่เป็น 0 หรือ 1 ดังนั้นคุณสามารถใช้คำสั่งของมันเองและกลับด้าน:if ! wget ...; then ...; fi
Nils Magnus

87

ดีกว่า

if ! wget -q --spider --tries=10 --timeout=20 google.com
then
  echo 'Sorry you are Offline'
  exit 1
fi

1
สำคัญ: เว้นช่องว่างระหว่าง!คำสั่งและคำสั่งต่อไปนี้มิฉะนั้นคุณจะทำการขยายประวัติ unix.stackexchange.com/questions/3747/…
Roland

2
สตีเว่นทำไมคุณถึงมีเพียง 1 ชื่อเสียง
Roland

8

หากคุณรู้สึกขี้เกียจนี่เป็นวิธีสั้น ๆ ในการจัดการเงื่อนไขโดยใช้||(หรือ) และ&&(และ) หลังการทำงาน:

wget -q --tries=10 --timeout=20 --spider http://google.com || \
{ echo "Sorry you are Offline" && exit 1; }

8
ในสคริปต์ในชีวิตจริงคุณควรเปลี่ยน&&หลังจากคำสั่ง echo ;ไป สาเหตุของเรื่องนี้คือหากเอาต์พุตถูกเปลี่ยนเส้นทางไปยังไฟล์บนดิสก์เต็มรูปแบบechoจะส่งคืนความล้มเหลวและexitจะไม่เริ่มทำงาน นี่อาจไม่ใช่พฤติกรรมที่คุณต้องการ
คะแนน _ ต่ำกว่า

หรือคุณสามารถใช้set -eและล้มเหลวechoก็จะออกจากสคริปต์ต่อไป
Jakub Bochenski

4

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

wget -q --tries=10 --timeout=20 --spider http://google.com
if (( $? != 0 )); then
    echo "Sorry you are Offline"
    exit 1
fi

สังเกตว่า-neคุณสามารถใช้!=แทน ในบริบททางคณิตศาสตร์เราไม่จำเป็นต้องเสริม$พารามิเตอร์เช่น

var_a=1
var_b=2
(( var_a < var_b )) && echo "a is smaller"

ทำงานได้ดีอย่างสมบูรณ์แบบ แม้ว่าจะไม่ได้ใช้กับ$?พารามิเตอร์พิเศษ แต่อย่างใด

นอกจากนี้เนื่องจาก(( ... ))ประเมินค่าที่ไม่เป็นศูนย์ให้เป็นจริงเช่นมีสถานะส่งคืนเป็น 0 สำหรับค่าที่ไม่เป็นศูนย์และสถานะกลับเป็น 1 มิฉะนั้นเราสามารถย่อให้

if (( $? )); then

แต่สิ่งนี้อาจทำให้ผู้คนสับสนมากกว่าการกดแป้นที่บันทึกไว้นั้นมีค่า

(( ... ))สร้างที่มีอยู่ในทุบตี แต่ไม่จำเป็นต้องตามข้อกำหนด POSIX เชลล์ (ดังกล่าวเป็นส่วนขยายที่เป็นไปได้แม้ว่า)

นี้เป็นทั้งหมดที่กล่าวว่ามันจะดีกว่าที่จะหลีกเลี่ยง$?โดยสิ้นเชิงในความคิดของฉันในขณะที่คำตอบของโคลและคำตอบของสตีเฟน



@ DavidC.Rankin โอ้ฉันไม่พบมัน! ดังนั้นจึงกล่าวถึงเป็นส่วนขยาย แต่ไม่จำเป็น ฉันจะแก้ไข
Benjamin W.

1
ใช่คนนั้นก็พาฉันเช่นกัน แน่นอนว่ามันช่วยให้ชีวิตง่ายขึ้นในเปลือก:)
เดวิดซีแรนคิ่น

4

คุณสามารถใช้การเปรียบเทียบที่ไม่เท่ากัน-neแทน-eq:

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -ne 0 ]]; then
    echo "Sorry you are Offline"
    exit 1
fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.