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

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

6
อะไรคือความแตกต่างระหว่างโอเปอเรเตอร์ Bash [[vs [vs (vs (vs))
ฉันสับสนเล็กน้อยเกี่ยวกับสิ่งที่ตัวดำเนินการเหล่านี้ทำแตกต่างกันเมื่อใช้ในการทุบตี [[ , [ , ( , (( ฉันเคยเห็นคนใช้พวกเขาถ้างบเช่นนี้: if [[condition]] if [condition] if ((condition)) if (condition)
245 bash  shell  test 

4
ทำไมการขยายพารามิเตอร์ด้วยช่องว่างโดยไม่ใส่เครื่องหมายอัญประกาศทำงานในวงเล็บสอง“ [[” แต่ไม่อยู่ในเครื่องหมายวงเล็บ”“”
ฉันสับสนกับการใช้วงเล็บเดียวหรือสองครั้ง ดูรหัสนี้: dir="/home/mazimi/VirtualBox VMs" if [[ -d ${dir} ]]; then echo "yep" fi มันทำงานได้อย่างสมบูรณ์แม้ว่าสตริงจะมีช่องว่าง แต่เมื่อฉันเปลี่ยนเป็นวงเล็บเดี่ยว: dir="/home/mazimi/VirtualBox VMs" if [ -d ${dir} ]; then echo "yep" fi มันบอกว่า: ./script.sh: line 5: [: /home/mazimi/VirtualBox: binary operator expected เมื่อฉันเปลี่ยนเป็น: dir="/home/mazimi/VirtualBox VMs" if [ -d "${dir}" ]; then echo "yep" fi มันใช้งานได้ดี ใครสามารถอธิบายสิ่งที่เกิดขึ้น? เมื่อใดที่ฉันควรกำหนดเครื่องหมายคำพูดคู่ล้อมรอบตัวแปร"${var}"เพื่อป้องกันปัญหาที่เกิดจากช่องว่าง
85 bash  quoting  ksh  test 

12
ฉันจะตรวจสอบว่ามีตัวแปรอยู่ในคำสั่ง 'if' ได้อย่างไร?
ฉันต้องการตรวจสอบการมีอยู่ของตัวแปรในifคำสั่ง สิ่งที่มีผลต่อ: if [ -v $somevar ] then echo "Variable somevar exists!" else echo "Variable somevar does not exist!" และคำถามที่ใกล้เคียงที่สุดคือคำถามนี้ซึ่งไม่ได้ตอบคำถามของฉัน
69 shell  variable  test 

3
ฉันจะตรวจสอบว่าไฟล์เป็นลิงค์สัญลักษณ์ไปยังไดเรกทอรีได้อย่างไร?
ฉันสามารถตรวจสอบได้ว่ามีไฟล์อยู่หรือไม่และเป็นลิงก์สัญลักษณ์ที่มี -L for file in *; do if [[ -L "$file" ]]; then echo "$file is a symlink"; else echo "$file is not a symlink"; fi done และถ้ามันเป็นไดเรกทอรีที่มี -d: for file in *; do if [[ -d "$file" ]]; then echo "$file is a directory"; else echo "$file is a …
64 bash  shell  test 

5
“ / bin / [” ทำงานอย่างไร
ฉันประหลาดใจเสมอที่ในโฟลเดอร์/binมี[โปรแกรม นี่คือสิ่งที่เรียกว่าเมื่อเรากำลังทำอะไรเช่น: if [ something ]? โดยการเรียก[โปรแกรมอย่างชัดเจนในเชลล์มันจะถามหาที่สอดคล้องกัน]และเมื่อฉันให้วงเล็บปิดมันดูเหมือนจะไม่ทำอะไรเลยไม่ว่าฉันจะแทรกอะไรระหว่างวงเล็บ จำเป็นต้องพูดทางปกติเกี่ยวกับการให้ความช่วยเหลือเกี่ยวกับโปรแกรมไม่ทำงานเช่นค่าman [มิได้[ --helpงาน
50 shell  test 

7
การทดสอบหรือ [หรือ [พกพาได้มากกว่าระหว่างเชลล์ bash และระหว่างเชลล์อื่นหรือไม่?
ฉันเห็นฉันสามารถทำ $ [ -w /home/durrantm ] && echo "writable" writable หรือ $ test -w /home/durrantm && echo "writable" writable หรือ $ [[ -w /home/durrantm ]] && echo "writable" writable ฉันชอบใช้ไวยากรณ์ที่สาม พวกมันเทียบเท่ากันในทุกวิถีทางและสำหรับคดีลบและคดีขอบ มีความแตกต่างในการพกพาเช่นระหว่างทุบตีบน Ubuntu และบน OS X หรือรุ่นทุบตีเก่า / ใหม่กว่าเช่นก่อน / หลัง 4.0 และพวกเขาทั้งสองขยายการแสดงออกในลักษณะเดียวกันหรือไม่


3
อะไรคือความแตกต่างระหว่าง [[$ a == z *]] และ [$ a == z *]
มีความแตกต่างระหว่างสองสิ่งนี้หรือไม่ [[ $a == z* ]] และ [ $a == z* ] ฉันสามารถมีตัวอย่างที่พวกเขาจะมีผลลัพธ์ที่แตกต่างกันหรือไม่ นอกจากนี้การทำงานของ[[ ]]แตกต่างกัน[ ]อย่างไร

6
ตรวจสอบว่าหมายเลขอินพุตเป็นจำนวนเต็มหรือไม่
ฉันพยายามตรวจสอบว่าการป้อนข้อมูลเป็นจำนวนเต็มหรือไม่และฉันผ่านไปหลายร้อยครั้ง แต่ไม่เห็นข้อผิดพลาดในสิ่งนี้ อนิจจามันไม่ทำงานมันเป็นต้นเหตุของคำสั่ง if สำหรับอินพุตทั้งหมด (ตัวเลข / ตัวอักษร) read scale if ! [[ "$scale" =~ "^[0-9]+$" ]] then echo "Sorry integers only" fi ฉันเล่นด้วยคำพูด แต่ก็ไม่ได้ทำหรือไม่ทำอะไรเลย ฉันทำอะไรผิด มีวิธีที่ง่ายกว่าในการทดสอบว่าอินพุตเป็นเพียงจำนวนเต็มหรือไม่?

8
ทดสอบว่ามีไฟล์ที่ตรงกับรูปแบบเพื่อเรียกใช้สคริปต์หรือไม่
ฉันพยายามเขียนifคำสั่งเพื่อทดสอบว่ามีไฟล์ใดที่ตรงกับรูปแบบที่กำหนดหรือไม่ หากมีไฟล์ข้อความในไดเรกทอรีควรเรียกใช้สคริปต์ที่กำหนด รหัสของฉันในปัจจุบัน: if [ -f /*.txt ]; then ./script fi โปรดให้แนวคิดบางอย่าง; ฉันต้องการเรียกใช้สคริปต์หากมีอยู่.txtในไดเรกทอรีเท่านั้น

4
ทดสอบว่าตัวแปรว่างในเชลล์สคริปต์หรือไม่
ฉันได้เห็นเทคนิคต่อไปนี้ใช้หลายครั้งในหลาย ๆ เชลล์เพื่อทดสอบว่าตัวแปรว่างเปล่าหรือไม่: if [ "x$1" = "x" ]; then # Variable is empty fi มีข้อได้เปรียบอะไรบ้างในการใช้สิ่งนี้มากกว่าที่ยอมรับมากกว่านี้if [ -z "$1" ]? มันอาจเป็นปัญหาการพกพาหรือไม่?

2
ข้อผิดพลาดในการทดสอบวงเล็บของเชลล์เมื่อสตริงเป็นวงเล็บซ้าย
ฉันเคยมีความมั่นใจเกี่ยวกับความจริงที่ว่าการอ้างถึงสตริงนั้นเป็นวิธีปฏิบัติที่ดีเสมอเพื่อหลีกเลี่ยงการแยกเชลล์ จากนั้นฉันก็เจอสิ่งนี้: $ x='(' $ [ "$x" = '1' -a "$y" = '1' ] bash: [: `)' expected, found 1 พยายามที่จะแยกปัญหาได้รับข้อผิดพลาดเดียวกัน: $ [ '(' = '1' -a '1' = '1' ] bash: [: `)' expected, found 1 ฉันแก้ไขปัญหาเช่นนี้: [ "$x" = '1' ] && [ "$y" = '1' ] ยังฉันต้องรู้ว่าเกิดอะไรขึ้นที่นี่
27 shell  test 


5
ฉันจะใช้วิธีทุบตีถ้าทดสอบและค้นหาคำสั่งด้วยกันได้อย่างไร
ฉันมีไดเรกทอรีที่มีบันทึกข้อผิดพลาดและฉันต้องการใช้คำสั่งแบบมีเงื่อนไขในสคริปต์ทุบตีตามคำสั่งค้นหา ไฟล์บันทึกจะถูกจัดเก็บในรูปแบบนี้: /var/log/crashes/app-2012-08-28.log /var/log/crashes/otherapp-2012-08-28.log ฉันต้องการให้คำสั่ง if ส่งคืนจริงถ้ามีบันทึกการทำงานล้มเหลวสำหรับแอปเฉพาะซึ่งได้รับการแก้ไขใน 5 นาทีที่ผ่าน findคำสั่งที่ผมจะใช้เป็น: find /var/log/crashes -name app-\*\.log -mmin -5 ฉันไม่แน่ใจว่าจะรวมเข้ากับifคำสั่งได้อย่างถูกต้อง ฉันคิดว่านี่อาจใช้งานได้: if [ test `find /var/log/crashes -name app-\*\.log -mmin -5` ] then service myapp restart fi มีบางพื้นที่ที่ฉันไม่ชัดเจน: ฉันดูที่ธง ifแต่ฉันไม่แน่ใจว่าควรใช้อันไหนถ้ามี ฉันต้องการtestคำสั่งหรือฉันควรประมวลผลผลลัพธ์ของคำสั่ง find โดยตรงหรืออาจใช้find... | wc -lเพื่อรับจำนวนบรรทัดแทน ไม่จำเป็น 100% ที่จะตอบคำถามนี้ แต่testสำหรับการทดสอบกับโค้ดส่งคืนที่คำสั่งส่งคืน? และพวกมันมองไม่เห็น - ด้านนอกของstdout/ stderr? …

4
เริ่มต้นด้วย bash: -lt และ -gt อาร์กิวเมนต์
ฉันเริ่มต้นด้วยทุบตีและฉันพบต่อไปนี้: if test $first -lt $second then echo $first is lower than $second else if test $first -gt $second then echo $first is higher than $second else echo $first and $second are equals fi fi สำหรับการอ่านสคริปต์และดำเนินการฉันรู้ว่ามันทำอะไร แต่ไม่ใช่สิ่งที่ -lt และ -gt ใครสามารถบอกฉันได้ว่าชื่อ 'เครื่องมือ' ประเภทนั้นคืออะไรและพวกเขา (-lt และ -gt) ทำอะไร ขอบคุณ!
24 bash  shell  test 

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