เมื่อฉันเรียกใช้คำสั่งในเชลล์ของฉันดังต่อไปนี้จะส่งคืนexpr: non-integer argument
ข้อผิดพลาด ใครช่วยอธิบายเรื่องนี้ให้ฉันฟังหน่อยได้ไหม
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
เมื่อฉันเรียกใช้คำสั่งในเชลล์ของฉันดังต่อไปนี้จะส่งคืนexpr: non-integer argument
ข้อผิดพลาด ใครช่วยอธิบายเรื่องนี้ให้ฉันฟังหน่อยได้ไหม
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
คำตอบ:
ตัวแปรเหล่านั้นคือตัวแปรเชลล์ ในการขยายเป็นพารามิเตอร์ไปยังโปรแกรมอื่น ( เช่น expr
) คุณต้องใช้$
คำนำหน้า:
expr $x / $y
สาเหตุที่บ่นเป็นเพราะคิดว่าคุณพยายามใช้งานตัวอักษร ( เช่นไม่ใช่จำนวนเต็ม)
หากคุณใช้ Bash shell คุณสามารถบรรลุผลลัพธ์เดียวกันได้โดยใช้ไวยากรณ์ของนิพจน์:
echo $((x / y))
หรือ:
z=$((x / y))
echo $z
man bash
ที่พร้อมท์ ( q
เพื่อออก)
ฉันเชื่อว่ามีการกล่าวถึงในหัวข้ออื่นแล้ว:
calc(){ awk "BEGIN { print "$*" }"; }
จากนั้นคุณสามารถพิมพ์:
calc 7.5/3.2
2.34375
ในกรณีของคุณจะเป็น:
x=20; y=3;
calc $x/$y
หรือหากคุณต้องการเพิ่มสิ่งนี้เป็นสคริปต์แยกต่างหากและทำให้พร้อมใช้งานใน $ PATH ดังนั้นคุณจะมีอยู่ในเชลล์ในเครื่องของคุณเสมอ:
#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }
echo '1 / 3' | bc -l
ทำไมไม่ใช้ let; ฉันพบว่ามันง่ายกว่ามาก นี่คือตัวอย่างที่คุณอาจพบว่ามีประโยชน์:
start=`date +%s`
# ... do something that takes a while ...
sleep 71
end=`date +%s`
let deltatime=end-start
let hours=deltatime/3600
let minutes=(deltatime/60)%60
let seconds=deltatime%60
printf "Time spent: %d:%02d:%02d\n" $hours $minutes $seconds
อีกตัวอย่างง่ายๆ - คำนวณจำนวนวันตั้งแต่ปี 1970:
let days=$(date +%s)/86400
เชลล์เริ่มต้นในการกระจาย Linux ส่วนใหญ่คือ Bash ในทุบตีตัวแปรต้องใช้คำนำหน้าเครื่องหมายดอลลาร์สำหรับการขยายตัวพารามิเตอร์ ตัวอย่างเช่น:
x=20
y=5
expr $x / $y
แน่นอนว่า Bash ยังมีตัวดำเนินการทางคณิตศาสตร์และไวยากรณ์การขยายเลขคณิตพิเศษดังนั้นจึงไม่จำเป็นต้องเรียกใช้ไบนารีexprเป็นกระบวนการแยกต่างหาก คุณสามารถปล่อยให้เชลล์ทำงานทั้งหมดดังนี้:
x=20; y=5
echo $((x / y))
expr
ท้อใจในปี 2013
หากต้องการรับตัวเลขหลังจุดทศนิยมคุณสามารถทำได้: -
read num1 num2
div=`echo $num1 / $num2 | bc -l`
echo $div
/
ใช้งานได้ดีเหมือนฉลากเคสเชลล์ สิ่งที่ใช้ไม่ได้คือการใช้*
เพื่อคูณโดยไม่ต้องอ้างถึงซึ่งอาจเป็นสิ่งที่คุณทำจริง ที่ทำให้สามารถแทนที่รายการต่อไปนี้ทั้งหมดในกรณีนี้ได้อย่างมีประสิทธิภาพซึ่งในตัวอย่างของคุณคือ 'devide' และ 'modulo'