วิธีการทดสอบว่าตัวแปรเท่ากับจำนวนในเปลือก


13

ฉันมีเชลล์สคริปต์นี้ซึ่งใช้งานไม่ได้

การป้อนข้อมูล:

Server_Name=1
if [ $Server_Name=1 ]; then  
echo Server Name is 1  
else
echo Server Name is not 1
fi

เอาท์พุท:

Server Name is 1

แต่ถ้าฉันเปลี่ยนServer_Name=2ผลลัพธ์คือ:

Server Name is 1

เมื่อฉันเปลี่ยนServer_Nameไปผมต้องการที่จะพูดได้:2Server Name is 2

ฉันรู้ว่ามันเป็นif [ $Server_Name=1 ];ส่วนหนึ่ง

ฉันจะแก้ไขได้อย่างไร


เมื่อเดวิดชี้ด้านล่างคุณต้องใช้ "-eq" เพื่อทดสอบค่าตัวเลข คุณอาจต้องการตรวจสอบตัวแปรว่างเพื่อหลีกเลี่ยงข้อผิดพลาด; if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
mikebabcock

คำตอบ:


22

สคริปต์ของคุณระบุว่าคุณกำลังใช้การเปรียบเทียบสตริง

สมมติว่าชื่อเซิร์ฟเวอร์อาจเป็นสตริงแทนตัวเลขเท่านั้น

สำหรับการเปรียบเทียบสตริง :
if [[ "$Server_Name" == 1 ]]; then

หมายเหตุ:

  • การเว้นวรรค == เป็นสิ่งที่ต้องทำ
  • การเว้นวรรค = เป็นต้องไม่
    if [ $Server_Name=1 ]; thenถูกต้อง

  • [[... ]] ช่วยลดข้อผิดพลาดเนื่องจากไม่มีการขยายชื่อพา ธ หรือการแยกคำที่เกิดขึ้นระหว่าง [[และ]]

  • ต้องการสตริงการอ้างอิงที่เป็น "คำ"

สำหรับการเปรียบเทียบจำนวนเต็ม :
if [[ "$Server_Name" -eq 1 ]]; then


ข้อมูลมากกว่านี้:


2
[[เป็นไวยากรณ์ของทุบตีและ OP ได้ถามเกี่ยวกับเชลล์ซึ่งมันใช้งานไม่ได้
gilad mayani


2
[ $Server_Name=1 ]

ไม่ทำงานตามที่คาดไว้เนื่องจากไวยากรณ์ภายในวงเล็บปีกกาไม่พิเศษสำหรับ Bash ตามปกติตัวแปร$Server_Nameรับแทนโดยที่ 1 เพื่อให้ทุกการทดสอบ ( [) คำสั่งเห็นคืออาร์กิวเมนต์เดียว: 1=1สตริง นับตั้งแต่ที่มีการต่อยที่ไม่ใช่ความยาวเป็นศูนย์, การทดสอบผลตอบแทนที่แท้จริง

สำหรับเชลล์ที่สอดคล้องกับ POSIX คุณสามารถใช้คำสั่งทดสอบต่อไปนี้:

[ "$Server_Name" = 1 ]

การตรวจสอบเป็นเท่ากับสตริง$Server_Name1

[ "$Server_Name" -eq 1 ]

เช็คคือ$Server_Nameเท่ากับจำนวน 1กล่าวคือมันทำการเปรียบเทียบตัวเลขแทนการเปรียบเทียบสตริง

Server_Name=01ค่าตอบแทนของทั้งสองคำสั่งจะแตกต่างกันเช่นถ้าคุณกำหนด คนแรกจะกลับเท็จคนที่สองจะกลับมาจริง

โปรดทราบว่าหากความเป็นไปได้มีอยู่ว่าตัวแปร$Server_Nameไม่ได้กำหนดไว้จะต้องมีการเสนอมิฉะนั้นการทดสอบจะแสดงข้อผิดพลาดเมื่อเรียกใช้


1

ลอง,

 #!/bin/bash
 Server_Name=50
 if [ $Server_Name = 49 ]
 then
 echo "Server Name is 50"
 else
 echo "Server Name is below 50"
 fi

เอาท์พุท:

 #./scriptname.sh
 Server Name is below 50

0

คำตอบง่ายๆ รหัสของคุณถูกต้อง - เกือบ สิ่งเดียวที่คุณขาดหายไปคือช่องว่าง ... (และอาจจะเป็นพิเศษ "=")

if [ $Server_Name=1 ]; then

จะไม่คำนวณอย่างถูกต้อง

if [ $Server_Name == 1 ]; then  

คือสิ่งที่คุณแสวงหา

และตอนนี้คำสั่งเกี่ยวกับสตริงกับตัวเลข เมื่อใดก็ตามที่คุณกำลังค้นหาการเปรียบเทียบเช่น / is-not == จะไม่เป็นไร

และฉันคิดว่าคุณมักจะมีชื่อเซิร์ฟเวอร์เป็นสตริงไม่ใช่ตัวเลขใช่ไหม ;-)

ขอให้โชคดีกับรหัสฝึกหัดที่แข็งแรงของคุณ

Ciao


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