Negate ในขณะที่เงื่อนไขวนในทุบตี


25

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

while  [[  $range =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]]
      do

ฉันจะหมุนสิ่งนี้เพื่อบอกว่าไม่เหมาะกับรูปแบบ ฉันหวังว่า!=~จะได้ผล แต่ฉันได้รับข้อผิดพลาดทางไวยากรณ์


2
Synner ข้อควรระวังข้อควรระวัง: ในขณะที่เห็นได้ชัดว่าคุณกำลังเขียนสคริปต์แบบโต้ตอบพลังอันยิ่งใหญ่ของการเขียนสคริปต์เชลล์นั้นมาจากความสามารถในการทำสิ่งเดียวกันด้วยสคริปต์เดียวกันทั้งแบบโต้ตอบและในโหมดแบทช์ จะเป็นเรื่องง่ายขึ้นในอนาคต (เมื่อคุณเริ่มใช้สคริปต์เป็นแบบเอกสารสำเร็จรูป) เพื่อป้อนตัวเลือกในบรรทัดคำสั่งและกลับมาทันทีด้วยรหัสออกที่ไม่ใช่ศูนย์ (และข้อความ) หากมีสิ่งผิดปกติ เพียง 2 เซ็นต์ของฉัน ...
Deer Hunter

คำตอบ:


60

การแก้ปัญหานั้นง่ายมากฉันแน่ใจว่าคุณทุกคนจะพบว่ามันตลก

ไม่จำเป็นต้องได้รับการทำงานขึ้นเกี่ยวกับรายละเอียดการปฏิเสธไวยากรณ์เพียงแค่ใช้แทนuntilwhile


9

สำหรับการเปรียบเทียบของสตริงหนึ่งควรใช้แทน!=!=~

จาก man bash

string1 != string2
          True if the strings are not equal.

=~ในขณะที่คุณกำลังใช้การแสดงออกปกติทางด้านขวาคุณจะต้องแน่นอน คุณสามารถเลือกที่จะปฏิเสธการแสดงออกทั้งหมด

while  [[  !( $range =~ ^[0-9]{1,3]}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ) ]]

ตัวอย่าง:

$ bash --version | head -n1
GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)
$ cat script
range='1'; while [[ !( $range =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ) ]]; do echo "$range NOT OK"; range+='.2'; sleep 1; done
echo "Finished"
$ bash script
1 NOT OK
1.2 NOT OK
1.2.2 NOT OK
Finished
$ 

ขอบคุณสำหรับคำตอบด่วน ฉันได้ลองก่อนที่จะโพสต์และตรวจสอบไม่ถูกต้อง ดูเหมือนว่าต้องการให้ ~ ทำงานอย่างถูกต้องเช่นกันเมื่อตรวจสอบว่าเหมาะสมกับรูปแบบหรือไม่
Synner

@Synner ตรวจสอบการแก้ไข
Bernhard

ไม่ทำงานกับbash4.2.42 pastebin.com/0vHh5MMB
จัดการ

1
@manatwork ลองใช้เชลล์ที่ไม่มีการโต้ตอบ
แบร์นฮาร์ด

@manatwork ดูการแก้ไขของฉัน
Bernhard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.