ทุบตี: ฉันยากจน [[<]]


14

ฉันกำลังเขียนสคริปต์ทุบตีและทันใดนั้นพฤติกรรมนี้ก็เริ่มต้น:

[[ 1 < 2 ]]; echo $?  # outputs 0
[[ 2 < 13 ]]; echo $? # outputs 1

แต่ใช้-ltงานได้ดี:

[[ 1 -lt 2 ]]; echo $?  # outputs 0
[[ 2 -lt 13 ]]; echo $? # outputs 0

ฉันเขียนทับ<อย่างใดโดยบังเอิญหรือไม่?

นี่คือสคริปต์ที่ฉันเขียนเพื่อทดสอบพฤติกรรมนี้:

#!/bin/bash

for a in {1..5}
do
    for b in {1..20}
    do
        [[ $a < $b ]] && echo $a $b
    done

    echo
done

นี่คือผลลัพธ์:

1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
1 14
1 15
1 16
1 17
1 18
1 19
1 20

2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 20

3 4
3 5
3 6
3 7
3 8
3 9

4 5
4 6
4 7
4 8
4 9

5 6
5 7
5 8
5 9

การเปลี่ยนแปลง<ไป-ltในสคริปต์ช่วยให้การส่งออกปกติ ( 5 10แสดงให้เห็นถึงตัวอย่าง)

การรีบูตเครื่องไม่ได้เปลี่ยนแปลงอะไรเลย

รุ่น bash ของฉันคือ GNU bash, รุ่น 4.3.42 (1) - ปล่อย (x86_64-pc-linux-gnu) ฉันใช้ Ubuntu 15.10 ฉันไม่ทราบว่ามีข้อมูลอื่นใดที่เกี่ยวข้องที่นี่


16
ด้วย<การดำเนินการคุณจะทำการเปรียบเทียบสตริงในขณะที่-ltผู้ประกอบการคือการเปรียบเทียบตัวเลขถ้าคุณดูผลลัพธ์ที่คุณได้ระบุไว้คุณจะตระหนักถึงมัน ตัวเลข 2 น้อยกว่า 10 ตามลำดับตัวอักษรและอีกวิธีหนึ่ง
MelBurslan

คำตอบ:


51

จากbashหน้าคน

เมื่อใช้กับ [[ตัวดำเนินการ <และ> จะเรียงลำดับพจนานุกรมโดยใช้ภาษาปัจจุบัน

ดูเหมือนว่าจะทำงานได้ตามที่ออกแบบไว้


35
กล่าวอีกนัยหนึ่งอ่าน man pageก่อนที่คุณจะคิดว่าคุณพบข้อผิดพลาด ;)
สัญลักษณ์แทน

จริง บางทีสคริปต์ที่ฉันเริ่มทำงานจริง ๆ แล้วเริ่มทำงานอย่างถูกต้องจริง '' (ในขณะที่ล้มเหลว [[$ myvar <13]]) เมื่อฉันสังเกตเห็นพฤติกรรมนี้แล้ว ตอนนี้มีอะไรที่ฉันควรทำอย่างไรกับคำถามนี้? พวกเราบนไซต์นี้เปลี่ยนชื่อเพื่อรวม [แก้ไข] หรืออะไรบางอย่าง? ควรเปลี่ยนชื่อเป็นคำอธิบายเพิ่มเติมหรือไม่
หอยทากในภารกิจ

2
ไม่ไม่เปลี่ยนชื่อคำถาม เครื่องหมายถูกที่อยู่ถัดจากคำตอบนี้เพียงพอที่จะระบุว่าคำถามได้รับการแก้ไขแล้ว
saiarcot895

14
@ Wildcard OP ไม่คิดว่าพวกเขาจะพบข้อผิดพลาด พวกเขาแนะนำอย่างชัดเจนว่าบางทีพวกเขาได้ทำอะไรบางอย่างเพื่อเปลี่ยนแปลงพฤติกรรม แม้แต่ชื่อก็ถือว่ามาก!
jpmc26

5

เกี่ยวกับ:

for a in {1..5}; 
do     
  for b in {1..20};     
  do         
    (( $a < $b )) && echo $a $b
  done      
  echo
done

ตามhttp://www.tldp.org/LDP/abs/html/dblparens.html

คล้ายกับคำสั่ง let โครงสร้าง ((... )) อนุญาตการขยายตัวทางคณิตศาสตร์และการประเมินผล ในรูปแบบที่ง่ายที่สุด a = $ ((5 + 3)) จะตั้งค่าเป็น 5 + 3 หรือ 8 อย่างไรก็ตามโครงสร้างวงเล็บคู่นี้ยังเป็นกลไกสำหรับการอนุญาตให้ปรับแต่งตัวแปร C ในรูปแบบ C เช่น , ((var ++))


2
คุณไม่มีจุดคำถาม - ไม่ใช่ "ฉันจะเปรียบเทียบค่าเหล่านั้นได้อย่างไร" แต่ "ทำไมมันถึงมีพฤติกรรมแบบที่มันเป็น"
guntbert

7
สิ่งนี้ได้รับคำตอบแล้ว แต่เมื่อเขาต้องการใช้นิพจน์ทางคณิตศาสตร์มันอาจจะคุ้มค่าที่ชี้ให้เห็นว่ามีโครงสร้างที่อนุญาตให้คุณใช้ในเชลล์
PaulSmecker

3

ประการแรก[[ ไม่ใช่ POSIXและควรหลีกเลี่ยง

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

if [ $((2 < 13)) = 1 ]
then
  echo '2 is less than 13'
else
  echo '2 is greater or equal to 13'
fi

หรือ:

if expr 2 '<' 13
then
  echo '2 is less than 13'
else
  echo '2 is greater or equal to 13'
fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.