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


3
$ () subshell หรือไม่
ฉันเข้าใจไวยากรณ์ของ subshell (<commands...>)เป็น$()เพียง subshell ที่คุณสามารถดึงค่าตัวแปรได้หรือไม่ หมายเหตุ: สิ่งนี้ใช้กับทุบตี 4.4 ตามถ้อยคำต่าง ๆ ในเอกสารประกอบ
51 bash  subshell  syntax 

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


1
ชื่อฟังก์ชันสคริปต์ Bash ที่มีเครื่องหมายโคลอนคู่ '::'
ฉันมาข้ามสคริปต์ทุบตีในวันนี้ว่ามีฟังก์ชั่นที่มีชื่อทวิภาคคู่::ในพวกเขาเช่นและfile::write() file::read()ฉันไม่เคยเห็นไวยากรณ์นี้มาก่อนในสคริปต์ Bash และเมื่อฉันเรียกใช้สคริปต์สคริปต์จะทำงานได้ดี (ทำให้ฉันประหลาดใจ) หลังจากกำจัด man page ของ Bash ในระบบของฉัน (และออนไลน์) ฉันไม่พบสิ่งใดในเอกสารที่สนับสนุนไวยากรณ์นี้สำหรับชื่อฟังก์ชัน ตัวอย่างเช่นส่วนShell Defined Functionsกำหนดไวยากรณ์สำหรับฟังก์ชั่นเปลือกที่จะ function name [()] compound-command [redirection] และจากนั้น (ที่อื่น ๆ ในคู่มือ) โทเค็นnameถูกกำหนดเป็น name A word consisting only of alphanumeric characters and underscores, and beginning with an alphabetic character or an underscore. Also referred to as an …

2
วิธีการส่งพารามิเตอร์เพื่อทำงานในสคริปต์ทุบตี?
ฉันต้องการเขียนฟังก์ชั่นที่ฉันสามารถโทรหาจากสคริปต์ที่มีตัวแปรต่าง ๆ มากมาย ด้วยเหตุผลบางอย่างฉันมีปัญหาในการทำเช่นนี้ ตัวอย่างที่ฉันอ่านเสมอใช้ตัวแปรทั่วโลก แต่นั่นจะไม่ทำให้โค้ดของฉันอ่านง่ายขึ้นเท่าที่ฉันเห็น ตัวอย่างการใช้งานที่ตั้งใจไว้: #!/bin/bash #myscript.sh var1=$1 var2=$2 var3=$3 var4=$4 add(){ result=$para1 + $para2 } add $var1 $var2 add $var3 $var4 # end of the script ./myscript.sh 1 2 3 4 ฉันลองใช้$1และในฟังก์ชั่น แต่หลังจากนั้นมันก็ใช้ทั่วโลกที่สคริปต์ทั้งหมดถูกเรียกจาก โดยทั่วไปสิ่งที่ฉันกำลังมองหาสิ่งที่ต้องการ$1, $2และอื่น ๆ แต่ในบริบทของท้องถิ่นของฟังก์ชั่น ฟังก์ชั่นทำงานในภาษาที่เหมาะสม

6
มีแนว shebang (การประกาศสคริปต์) มากเกินไป - วิธีใดที่จะลดจำนวนลงบ้าง
ฉันมีโครงการประกอบด้วย.shไฟล์ขนาดเล็กประมาณ 20 ไฟล์ ฉันตั้งชื่อ "เล็ก" เหล่านี้เพราะโดยทั่วไปไม่มีไฟล์ใดที่มีโค้ดเกิน 20 บรรทัด ฉันใช้แนวทางแบบแยกส่วนเพราะฉันภักดีต่อปรัชญา Unixและง่ายต่อการดูแลรักษาโครงการ ในการเริ่มต้นของแต่ละไฟล์ผมใส่.sh#!/bin/bash ฉันเข้าใจว่าการประกาศสคริปต์มีจุดประสงค์สองประการ: พวกเขาช่วยให้ผู้ใช้เรียกคืนสิ่งที่เชลล์ต้องการเพื่อเรียกใช้ไฟล์ (พูดหลังจากผ่านไปหลายปีโดยไม่ต้องใช้ไฟล์) พวกเขาให้แน่ใจว่าสคริปต์ทำงานเฉพาะกับเปลือกบางอย่าง (ทุบตีในกรณีนั้น) เพื่อป้องกันพฤติกรรมที่ไม่คาดคิดในกรณีที่ใช้เปลือกอื่น เมื่อโครงการเริ่มเติบโตจากไฟล์ 5 ไฟล์เป็น 20 ไฟล์หรือจาก 20 ไฟล์เป็น 50 ไฟล์ (ไม่ใช่กรณีนี้ แต่เพื่อสาธิต) เรามีการประกาศสคริปต์20 บรรทัดหรือ 50 บรรทัด ฉันยอมรับแม้ว่ามันอาจจะตลกสำหรับบางคน แต่ก็รู้สึกซ้ำซ้อนสำหรับฉันที่จะใช้ 20 หรือ 50 แทนที่จะพูดเพียง1 ต่อโครงการ (อาจเป็นไฟล์หลักของโครงการ) มีวิธีที่จะหลีกเลี่ยงความซ้ำซ้อนที่ถูกกล่าวหานี้ 20 หรือ 50 หรือจำนวนบรรทัดของการประกาศสคริปต์มากขึ้นโดยใช้การประกาศสคริปต์ "ทั่วโลก" ในไฟล์หลักบางไฟล์?

1
ทำไมคุณไม่สามารถย้อนกลับลำดับของโอเปอเรเตอร์การเปลี่ยนเส้นทางอินพุตในขณะที่ลูปได้
ใน Bash คุณสามารถย้ายโอเปอเรเตอร์การเปลี่ยนเส้นทางอินพุตไปยังด้านหน้าของคำสั่ง: cat <<< "hello" # equivalent to <<< "hello" cat ทำไมคุณไม่ทำเช่นเดียวกันกับลูปในขณะที่? while read -r line; do echo "$line"; done <<< "hello" # hello <<< "hello" while read -r line; do echo "$line"; done # -bash: syntax error near unexpected token `do' ฉันคิดว่ามันค่อนข้างสับสนเพราะคุณสามารถไปป์ในขณะที่ ฉันกำลังทำอะไรผิดหรือเป็นเพียงการตัดสินใจออกแบบหรือไม่

2
ทำไมกลุ่มคำสั่ง brace ต้องการช่องว่างหลังจากเปิดวงเล็บปีกกาใน POSIX Shell Grammar
TL; DR : ทำไมช่องว่างกลุ่ม POSIX รั้งจำเป็นหลังจาก{คำสงวน แต่ subshell ไม่หลังจากคำสงวน(? ไวยากรณ์ของ POSIX เชลล์กำหนดกลุ่มวงเล็บปีกกาและ subshell ดังนี้ brace_group : Lbrace compound_list Rbrace subshell : '(' compound_list ')' ทีนี้ถ้าเราอ่านว่าช่องว่างนั้นสำคัญมาก นี่หมายความว่าจะต้องมีพื้นที่ที่แยกเปิดและปิดวงเล็บปีกกาและวงเล็บเช่นเดียวกับใน { echo hello world; } ( echo hello world ) สิ่งนี้จะสอดคล้องกับคำสั่งคำสั่งผสม : คำสั่งผสมเหล่านี้แต่ละคำมีคำที่สงวนไว้หรือผู้ดำเนินการควบคุมในตอนเริ่มต้นและคำที่สงวนไว้สำหรับคำสั่งสุดท้ายหรือคำว่าผู้ประกอบการที่เกี่ยวข้องในตอนท้าย อย่างไรก็ตามสิ่งที่ไม่สมเหตุสมผลคือเหตุผล(list)และ( list )ทำงานได้ดี ( (ไม่จำเป็นต้องใช้พื้นที่นั้นหลังจากนั้น) อย่างไรก็ตามการขยายตัวของรั้งต้องมีพื้นที่ชั้นนำเช่น{echo hello;}ไม่ทำงาน แน่นอนว่าคำที่สงวนไว้ซึ่งได้รับการปฏิบัติเหมือนคำว่าเชลล์จำเป็นต้องเว้นวรรคเพื่อให้สอดคล้องกับแนวคิดของการแยกฟิลด์อย่างไรก็ตามคำจำกัดความของตัวเองไม่ได้พูดถึงช่องว่าง นอกจากนี้หาก{และ(ทั้งคู่ถือว่าคำที่สงวนไว้โดยนิยาม POSIX ของคำสั่งผสมทำไมพวกเขาถึงได้รับการปฏิบัติที่แตกต่างกันเกี่ยวกับอักขระช่องว่างหลังจากคำที่สงวนไว้เหล่านี้? …
10 shell  posix  subshell  syntax 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.