คำถามติดแท็ก control-flow

โฟลว์การควบคุมหมายถึงลำดับที่โค้ดคอมพิวเตอร์ถูกเรียกใช้เมื่อโปรแกรมหรือสคริปต์ทำงาน ตัวอย่าง ได้แก่ การวนซ้ำ (รหัสซ้ำ) และเงื่อนไขที่เรียกใช้สาขาหนึ่งแทนอีกสาขาหนึ่ง ใช้แท็กนี้สำหรับคำถามเกี่ยวกับโฟลว์การควบคุมในสคริปต์หรือโปรแกรมไม่ใช่คำถามเกี่ยวกับการควบคุมโฟลว์เทอร์มินัล


3
ตัวควบคุมและการเปลี่ยนเส้นทางของเชลล์คืออะไร
ฉันมักจะเห็นบทเรียนออนไลน์ที่เชื่อมต่อคำสั่งต่าง ๆ ด้วยสัญลักษณ์ที่แตกต่างกัน ตัวอย่างเช่น: command1 | command2 command1 & command2 command1 || command2 command1 && command2 คนอื่น ๆ ดูเหมือนจะเชื่อมต่อคำสั่งกับไฟล์: command1 > file1 command1 >> file1 สิ่งเหล่านี้คืออะไร พวกเขาเรียกว่าอะไร พวกเขาทำอะไร? มีอะไรอีกบ้าง? Meta หัวข้อเกี่ยวกับคำถามนี้ .

6
การใช้ && และ || สับสน ผู้ประกอบการ
ฉันอ่านผ่าน/etc/rc.d/init.d/sendmailไฟล์ (ฉันรู้ว่านี่ไม่ค่อยใช้ แต่ฉันกำลังเรียนเพื่อสอบ) และฉันสับสนเล็กน้อยเกี่ยวกับตัวดำเนินการ&&และตัว||ดำเนินการ ฉันอ่านที่พวกเขาสามารถใช้ในงบเช่น: if [ test1 ] && [ test2 ]; then echo "both tests are true" elif [ test1 ] || [ test2 ]; then echo "one test is true" fi อย่างไรก็ตามสคริปต์นี้แสดงคำสั่งบรรทัดเดียวเช่น: [ -z "$SMQUEUE" ] && SMQUEUE="QUEUE" [ -f /usr/sbin/sendmail ] || exit 0 สิ่งเหล่านี้ดูเหมือนจะใช้&&และ||โอเปอเรเตอร์เพื่อล้วงเอาการตอบสนองจากการทดสอบ แต่ฉันไม่สามารถขุดเอกสารเกี่ยวกับการใช้งานของผู้ให้บริการเหล่านี้ได้ …

7
กด space เพื่อดำเนินการต่อ
ฉันจะหยุดสคริปต์ทุบตีจนกว่าผู้ใช้จะกดได้Spaceอย่างไร ฉันต้องการมีคำถามในสคริปต์ของฉัน กด space เพื่อดำเนินการต่อหรือCTRL+ Cเพื่อออก จากนั้นสคริปต์ควรหยุดและรอจนกว่าจะกด Space

2
วิธีการวนลูปมากกว่าบรรทัดของไฟล์?
บอกว่าฉันมีไฟล์นี้: hello world hello world โปรแกรมนี้ #!/bin/bash for i in $(cat $1); do echo "tester: $i" done เอาท์พุท tester: hello tester: world tester: hello tester: world ฉันต้องการให้มีการวนforซ้ำในแต่ละบรรทัดโดยไม่สนใจ whitespaces แม้ว่าเช่นควรจะแทนที่สองบรรทัดสุดท้าย tester: hello world การใช้เครื่องหมายคำพูดfor i in "$(cat $1)";ส่งผลiให้มีการกำหนดไฟล์ทั้งหมดในครั้งเดียว ฉันควรเปลี่ยนอะไร

3
ทดสอบว่าสตริงมีสตริงย่อยหรือไม่
ฉันมีรหัส file="JetConst_reco_allconst_4j2t.png" if [[ $file == *_gen_* ]]; then echo "True" else echo "False" fi ฉันทดสอบว่าfileมี "gen" หรือไม่ ผลลัพธ์คือ "เท็จ" ดี! ปัญหาคือเมื่อฉันแทนที่ "gen" ด้วยตัวแปรtestseq: file="JetConst_reco_allconst_4j2t.png" testseq="gen" if [[ $file == *_$testseq_* ]]; then echo "True" else echo "False" fi ตอนนี้เอาต์พุตคือ "True" มันจะเป็นอย่างไร จะแก้ไขปัญหาได้อย่างไร

4
ถ้ามีอย่างอื่นคำสั่งเทียบเท่ากับตรรกะและ && หรือ || และฉันจะเลือกอันไหนดีกว่ากัน
ฉันเรียนรู้เกี่ยวกับโครงสร้างการตัดสินใจและฉันเจอรหัสเหล่านี้: if [ -f ./myfile ] then cat ./myfile else cat /home/user/myfile fi [ -f ./myfile ] && cat ./myfile || cat /home/user/myfile พวกเขาทั้งสองทำงานเหมือนกัน มีข้อได้เปรียบอะไรบ้างในการใช้งานจากอีกทางหนึ่ง?


2
Bash“ for” loop โดยไม่มีส่วน“ in foo bar …”
ฉันเพิ่งดูรหัสบางอย่างที่สับสนฉันเพราะมันใช้งานได้และฉันไม่ได้คาดหวัง รหัสย่อมาจากตัวอย่างนี้ #!/bin/bash for var; do echo "$var" done เมื่อรันด้วยอาร์กิวเมนต์บรรทัดคำสั่งจะพิมพ์ออกมา $ ./test a b c a b c นี่คือสิ่งที่คาดไม่ถึงสำหรับฉัน เหตุใดจึงไม่ส่งผลให้เกิดข้อผิดพลาดเนื่องจากvarไม่ได้กำหนดไว้? การใช้สิ่งนี้ถือว่าเป็น 'การปฏิบัติที่ดี' หรือไม่?

3
วนรอบสองบรรทัดของไฟล์แบบขนาน [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นไปตามหัวข้อสำหรับ Unix & Linux Stack Exchange ปิดให้บริการใน5 ปีที่ผ่านมา เป้าหมายของสคริปต์ที่ฉันทำคือการเปรียบเทียบไฟล์สองชุด ชื่อไฟล์จะถูกจัดเก็บไว้ในสองไฟล์แยกกันหนึ่งพา ธ ต่อบรรทัด ความคิดของฉันคือมีสองwhile readลูปหนึ่งอันสำหรับแต่ละชื่อไฟล์ แต่ฉันจะผสมลูปทั้งสองเข้าด้วยกันได้อย่างไร while read compareFile <&3; do if [[ ! $server =~ [^[:space:]] ]] ; then #empty line exception continue fi echo "Comparing file - $compareFile" if diff "$compareFile" _(other file from loop?_) …


2
ส่งงานไปที่พื้นหลังใน“ ถ้า”
ทำไมนี้ if true; then sleep 3 &; fi bash: syntax error near unexpected token `;' ฉันต้องการวิ่ง sleep 3 ในพื้นหลังเพื่อให้คำสั่ง ["sleep 3" เป็นเพียงตัวอย่าง] จะทำงานในสไตล์ "paralell" ดังนั้นจึงเสร็จเร็วขึ้น แต่ฉันได้รับสิ่งนี้: bash: syntax error near unexpected token `;' ข้อความผิดพลาด. ทำไม? ทำไมฉันไม่สามารถส่งงานไปที่พื้นหลังได้?

2
การร้องขออินพุตของผู้ใช้ขณะอ่านบรรทัดไฟล์ตามบรรทัด
สำหรับคลาสฉันต้องเขียนสคริปต์ Bash ที่จะเอาท์พุทจากispellและเมื่อฉันลองและขอให้ผู้ใช้ป้อนข้อมูลในขณะที่ลูปมันก็แค่บันทึกบรรทัดถัดไปของไฟล์เป็นอินพุตของผู้ใช้ ฉันจะขอผู้ใช้ในขณะที่วนรอบได้อย่างไร? #!/bin/bash #Returns the misspelled words #ispell -l < file #define vars ISPELL_OUTPUT_FILE="output.tmp"; INPUT_FILE=$1 ispell -l < $INPUT_FILE > $ISPELL_OUTPUT_FILE; #echo a new line for give space between command #and the output generated echo ""; while read line; do echo "'$line' is misspelled. Press "Enter" to keep"; …


1
วิธีที่มีประสิทธิภาพมากที่สุดในการรัน 2 ในขณะที่ลูป
ขณะนี้ฉันใช้whileลูปสองแบบที่แตกต่างกันเพื่อเริ่มตัวจัดการหน้าต่างdwmและแถบสถานะที่พิมพ์ข้อมูลระบบลงไป โซลูชันของฉันในขณะนี้คือเรียกใช้พวกเขาอย่างต่อเนื่องในสคริปต์เดียวกันเช่น: while true; do $HOME/Scripts/dwm-status sleep 2s done & while true; do dwm >/dev/null done ฉันเคยเห็นมันทำงานเป็นwhileวนซ้ำเช่นนี้: while true; do while true; do $HOME/Scripts/dwm-status sleep 2s done & dwm >/dev/null done ประการที่สองดูเหมือนว่าจะทำให้เกิด CPU แหลม ในแง่ของประสิทธิภาพ (เรียกใช้ทรัพยากรอย่างน้อยที่สุดเป็นต้น) วิธีที่ดีที่สุดในการใช้งานลูปทั้งสองนี้คืออะไรและเพราะเหตุใด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.