คำถามติดแท็ก test

นี่เป็นเรื่องเกี่ยวกับยูทิลิตี Unix ที่เรียกว่า "test" ซึ่งเรียกว่า "[" หรือไวยากรณ์ของเชลล์ [[…]] สำหรับคำถามเกี่ยวกับการทดสอบซอฟต์แวร์และการตั้งค่าให้ใช้แท็ก "การทดสอบ"


5
ทำไมต้องใช้เครื่องหมายคำพูดคู่ในการทดสอบ [[]]
สมมติว่าเรามีจำนวนเต็ม 2 ตัวในสคริปต์ทุบตี: value1=5 value2=3 แล้วทำไมเราต้องใช้เครื่องหมายคำพูดคู่ในกรณีของการทดสอบ? ตัวอย่างเช่น: if [[ "$value1" -eq "$value2" ]] ทำไมไม่ลองใช้สิ่งต่อไปนี้? if [[ $value1 -eq $value2 ]] สำหรับฉันการเสนอราคาสองครั้งไม่สมเหตุสมผลเลย
23 bash  shell  quoting  variable  test 

3
ไวยากรณ์ของเรื่องไม่เท่ากันหรือไม่
เมื่อทำการเขียนสคริปต์ฉันมักจะเขียน ifs ของฉันด้วยไวยากรณ์ต่อไปนี้เพราะฉันเข้าใจได้ง่ายขึ้นว่าสิ่งต่อไปนี้ไม่เป็นความจริง if [ ! "$1" = "$2" ]; then บางคนบอกว่าวิธีการด้านล่างดีกว่า if [ "$1" != "$2" ]; then สิ่งนี้คือเมื่อฉันถามว่าทำไมและมีความแตกต่างกันหรือไม่ไม่มีใครดูเหมือนจะมีคำตอบใด ๆ ดังนั้นมีความแตกต่างระหว่างสองไวยากรณ์หรือไม่ หนึ่งในนั้นปลอดภัยกว่าหรือไม่ หรือมันเป็นเพียงเรื่องของการตั้งค่า / นิสัย?
22 shell  test 

3
เปรียบเทียบสองสตริงใน Bash
ฉันมีifบล็อกต่อไปนี้ในสคริปต์ทุบตีของฉัน: if [ ${PACKAGENAME} -eq kakadu-v6_4-00902C ]; then echo "successfully entered if block!!" fi การดำเนินการสคริปต์ไม่ได้เข้ามาของฉันifบล็อกแม้ว่าจะมีค่าเท่ากับ$PACKAGENAME kakadu-v6_4-00902Cผมทำอะไรผิดหรือเปล่า?

3
มีความแตกต่างที่สำคัญเมื่อเปรียบเทียบตัวแปรเป็นสตริงหรือเป็น int
จากความอยากรู้เมื่อทำการเปรียบเทียบตัวแปรทุบตี (ความคุ้มค่าเป็นinteger) ก็เป็นไปได้ที่จะทดสอบกับค่าที่กำหนดไว้ล่วงหน้าบางส่วนประกาศว่าจะเป็นหรือเป็นintstring สคริปต์ตัวอย่าง : #!/bin/bash f1() { [ "$1" == "1" ] && echo "$FUNCNAME: \"1\" compared as string" } f2() { [[ "$1" -eq 1 ]] && echo "$FUNCNAME: \"1\" compared as int" } f1 $1 f2 $1 ผลผลิต : $ ./param.sh 1 f1: "1" compared as string …
22 bash  shell  test 

4
ทดสอบ unix เมื่อใดควรใช้ eq vs = vs == ในคำสั่งทดสอบ?
เมื่อใดที่ฉันควรใช้-eqvs =vs== เช่น [[ $num -eq 0 ]] [[ $num = 'zzz' ]] ฉันสังเกตรูปแบบการใช้-eq(และ-neอื่น ๆ ) สำหรับตัวเลขและ=สตริง มีเหตุผลสำหรับสิ่งนี้และเมื่อใดที่ฉันควรใช้==
22 shell  test 

2
การแสดงออกวงเล็บ (ไม่มีช่วง) จับคู่ตัวละครที่ไม่คาดคิดในทุบตี
ฉันใช้ทุบตีบน Linux ฉันได้รับความสำเร็จจากคำสั่ง if ต่อไปนี้ แต่ไม่ควรส่งคืนรหัสที่ล้มเหลวหรือ if [[ ■ = [⅕⅖⅗] ]] ; then echo yes ; fi สี่เหลี่ยมจัตุรัสไม่เท่ากับอักขระใด ๆ ดังนั้นฉันจึงไม่เห็นสาเหตุที่ฉันได้รหัสสำเร็จ เป็นสิ่งสำคัญสำหรับฉันที่จะเก็บวงเล็บคู่ไว้ในกระเป๋า มีวิธีอื่นที่จะทำช่วงในสถานการณ์นี้หรือคำแนะนำอื่น ๆ ?
20 bash  locale  test 


3
การเปรียบเทียบจำนวนเต็ม: การแสดงออกทางคณิตศาสตร์หรือการแสดงออกตามเงื่อนไข
ใน Bash คุณสามารถเปรียบเทียบจำนวนเต็มสองจำนวนได้โดยใช้นิพจน์เงื่อนไข arg1 OP arg2 OP เป็นหนึ่ง-eq, -ne, -lt, -le, หรือ-gt -geตัวดำเนินการเลขคณิตเหล่านี้จะคืนค่าจริงถ้าarg1เท่ากับ, ไม่เท่ากับ, น้อยกว่า, น้อยกว่าหรือเท่ากับ, มากกว่าหรือมากกว่าหรือเท่ากับarg2ตามลำดับ Arg1และarg2อาจเป็นจำนวนเต็มบวกหรือลบ หรือการแสดงออกทางคณิตศาสตร์: <= >= < > การเปรียบเทียบ == != ความเสมอภาคและความไม่เท่าเทียม ทำไมเรามีสองวิธีที่แตกต่างกันในการเปรียบเทียบจำนวนเต็มสองตัว? จะใช้เมื่อใด ตัวอย่างเช่น[[ 3 -lt 2 ]]ใช้นิพจน์เงื่อนไขและ(( 3 < 2 ))ใช้นิพจน์ทางคณิตศาสตร์ ทั้งคู่คืนค่า 0 เมื่อการเปรียบเทียบเป็นจริง เมื่อเปรียบเทียบจำนวนเต็มสองจำนวนทั้งสองวิธีสามารถใช้แทนกันได้หรือไม่ ถ้าใช่ทำไม Bash มีสองวิธีมากกว่าหนึ่ง?

3
เครื่องหมายวงเล็บในเงื่อนไข if: เหตุใดฉันจึงได้รับข้อผิดพลาดทางไวยากรณ์โดยไม่มีช่องว่าง
ฉันใช้สคริปต์ด้านล่างเพื่อย้ายสองวันกลับเมื่อสคริปต์ทำงานที่เริ่มต้นสองวันของปีและตรวจสอบวันแรกและวันที่สองของทุกเดือนและย้ายกลับสองวัน if [$month="01"] && [$day="01"]; then date="$last_month/$yes_day/$last_year" fulldate="$last_month/$yes_day/$last_year" else if [$month="01"] && [$day="02"]; then date="$last_month/$yes_day/$last_year" fulldate="$last_month/$yes_day/$last_year" else if [ $day = "01" ]; then date="$last_month/$yes_day/$year" fulldate="$year$last_month$yes_day" else if [ $day = "02" ]; then date="$last_month/$yes_day/$year" fulldate="$year$last_month$yes_day" else date="$month/$yes_day/$year" fulldate="$year$month$yes_day" fi fi fi fi แต่ฉันไม่ดีได้รับข้อความแสดงข้อผิดพลาดด้านล่าง Etime_script.sh: line 19: [06=01]: command not …

3
จะทดสอบว่าตัวแปรถูกกำหนดใน Bash ก่อนเวอร์ชั่น 4.2 ด้วยตัวเลือกเชลล์ของคำนามได้อย่างไร?
สำหรับเวอร์ชัน Bash ก่อนหน้า "GNU bash เวอร์ชัน 4.2" มีทางเลือกอื่นใดเทียบเท่าสำหรับ-vตัวเลือกของtestคำสั่งหรือไม่ ตัวอย่างเช่น: shopt -os nounset test -v foobar && echo foo || echo bar # Output: bar foobar= test -v foobar && echo foo || echo bar # Output: foo
16 bash  test 

3
ทุบตี: ฉันยากจน [[<]]
ฉันกำลังเขียนสคริปต์ทุบตีและทันใดนั้นพฤติกรรมนี้ก็เริ่มต้น: [[ 1 &lt; 2 ]]; echo $? # outputs 0 [[ 2 &lt; 13 ]]; echo $? # outputs 1 แต่ใช้-ltงานได้ดี: [[ 1 -lt 2 ]]; echo $? # outputs 0 [[ 2 -lt 13 ]]; echo $? # outputs 0 ฉันเขียนทับ&lt;อย่างใดโดยบังเอิญหรือไม่? นี่คือสคริปต์ที่ฉันเขียนเพื่อทดสอบพฤติกรรมนี้: #!/bin/bash for a in {1..5} do …
14 bash  test 

5
วิธีเปรียบเทียบเวอร์ชันของโปรแกรมในเชลล์สคริปต์
สมมติว่าฉันต้องการเปรียบเทียบgccรุ่นเพื่อดูว่าระบบได้ติดตั้งรุ่นขั้นต่ำหรือไม่ ในการตรวจสอบgccเวอร์ชั่นฉันดำเนินการดังต่อไปนี้ gcc --version | head -n1 | cut -d" " -f4 ผลลัพธ์ก็คือ 4.8.5 ดังนั้นฉันจึงเขียนifคำสั่งง่ายๆเพื่อตรวจสอบรุ่นนี้เทียบกับค่าอื่น ๆ if [ "$(gcc --version | head -n1 | cut -d" " -f4)" -lt 5.0.0 ]; then echo "Less than 5.0.0" else echo "Greater than 5.0.0" fi แต่มันเกิดข้อผิดพลาด: [: integer expression expected: 4.8.5 ฉันเข้าใจความผิดพลาดของฉันว่าฉันกำลังใช้สตริงเพื่อเปรียบเทียบและ-ltต้องการจำนวนเต็ม ดังนั้นมีวิธีอื่นในการเปรียบเทียบรุ่นหรือไม่


2
`ทดสอบ 'และ` [' - ไบนารีต่างกันมีความแตกต่างกันอย่างไร
ผมสังเกตเห็นในขณะที่ตอบคำถามที่ว่าคนอื่นtestและ[เป็นไบนารีแตกต่างกัน แต่[manpage ดึงขึ้นtestมา นอกจากข้อกำหนดสำหรับการจบ]แล้วยังมีความแตกต่างหรือไม่? ถ้าไม่ทำไมพวกเขาแยกไบนารีแทนที่จะถูกเชื่อมโยงกัน? (พวกเขายังสร้างbashภายในและbashไม่แสดงความแตกต่างเช่นกัน)

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