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

สำหรับคำถามเกี่ยวกับสคริปต์ที่เขียนขึ้นสำหรับเชลล์คำสั่ง Bash สำหรับเชลล์สคริปต์ที่มีข้อผิดพลาด / ข้อผิดพลาดทางไวยากรณ์โปรดตรวจสอบด้วยโปรแกรม shellcheck (หรือในเซิร์ฟเวอร์ shellcheck เว็บที่ https://shellcheck.net) ก่อนโพสต์ที่นี่ คำถามเกี่ยวกับการใช้งานอินเทอร์แอคทีฟของ Bash นั้นมีแนวโน้มที่จะอยู่ในหัวข้อของผู้ใช้ขั้นสูงมากกว่าในสแต็คโอเวอร์โฟลว์

5
วิธีการวนซ้ำไฟล์ในไดเรกทอรีและเปลี่ยนเส้นทางและเพิ่มคำต่อท้ายชื่อไฟล์
ฉันต้องเขียนสคริปต์ที่เริ่มต้นโปรแกรมของฉันด้วยอาร์กิวเมนต์ที่ต่างกัน แต่ฉันใหม่สำหรับ Bash ฉันเริ่มโปรแกรมด้วย: ./MyProgram.exe Data/data1.txt [Logs/data1_Log.txt]. นี่คือรหัสเทียมสำหรับสิ่งที่ฉันต้องการจะทำ: for each filename in /Data do for int i = 0, i = 3, i++ ./MyProgram.exe Data/filename.txt Logs/filename_Log{i}.txt end for end for ดังนั้นฉันจึงงงว่าจะสร้างอาร์กิวเมนต์ที่สองจากอันแรกได้อย่างไรดูเหมือน dataABCD_Log1.txt และเริ่มโปรแกรมของฉัน
562 bash  for-loop  filenames  glob 

6
ฉันจะรับ cURL เพื่อไม่แสดงแถบความคืบหน้าได้อย่างไร
ฉันพยายามใช้ cURL ในสคริปต์และทำให้มันไม่แสดงแถบความคืบหน้า ฉันได้พยายาม-s, -silent, -Sและ-quietตัวเลือก แต่ไม่มีของพวกเขาทำงาน นี่เป็นคำสั่งทั่วไปที่ฉันได้ลอง: curl -s http://google.com > temp.html ฉันเพิ่งได้รับแถบความคืบหน้าเมื่อกดไปที่ไฟล์ดังนั้นจึงcurl -s http://google.comไม่มีแถบความคืบหน้า แต่curl -s http://google.com > temp.htmlจะมี
562 linux  bash  unix  scripting  curl 

30
วิธีรอใน bash เพื่อให้หลาย ๆ กระบวนการย่อยเสร็จสิ้นและกลับรหัสทางออก! = 0 เมื่อกระบวนการย่อยใด ๆ จบลงด้วยรหัส! = 0
จะรอสคริปต์ bash สำหรับหลาย ๆ subprocesses ที่เกิดจาก script นั้นเพื่อเสร็จสิ้นและส่งกลับ code exit! = 0 เมื่อกระบวนการย่อยใด ๆ จบลงด้วย code! = 0? สคริปต์ง่าย ๆ : #!/bin/bash for i in `seq 0 9`; do doCalculations $i & done wait สคริปต์ด้านบนจะรอการประมวลผลย่อยทั้งหมด 10 รายการ แต่จะให้สถานะการออก 0 เสมอ (ดูhelp wait) ฉันจะแก้ไขสคริปต์นี้ได้อย่างไรเพื่อให้ค้นพบสถานะการออกของโพรเซสย่อยที่เกิดและกลับรหัสทางออก 1 เมื่อโพรเซสใด ๆ ที่ลงท้ายด้วยรหัส! = 0? มีวิธีแก้ปัญหาที่ดีกว่าการรวบรวม …
562 bash  process  wait 

14
ค้นหาและแทนที่ภายในไฟล์ข้อความจากคำสั่ง Bash
วิธีที่ง่ายที่สุดในการค้นหาและแทนที่สตริงอินพุตที่ระบุพูดabcและแทนที่ด้วยสตริงอื่นคือพูดXYZในไฟล์/tmp/file.txt? ฉันกำลังเขียนแอพและใช้ IronPython เพื่อดำเนินการคำสั่งผ่าน SSH - แต่ฉันไม่รู้จัก Unix ที่ดีและไม่รู้ว่าจะหาอะไร ฉันได้ยินมาว่า Bash นอกเหนือจากการเป็นอินเตอร์เฟสบรรทัดคำสั่งอาจเป็นภาษาสคริปต์ที่ทรงพลังมาก ดังนั้นถ้าเป็นจริงฉันคิดว่าคุณสามารถทำสิ่งเหล่านี้ได้ ฉันสามารถทำได้ด้วยการทุบตีและสคริปต์ (บรรทัดเดียว) ที่ง่ายที่สุดในการบรรลุเป้าหมายของฉันคืออะไร


16
ฉันจะลบบรรทัดแรกของไฟล์ข้อความโดยใช้สคริปต์ bash / sed ได้อย่างไร
ฉันจำเป็นต้องลบบรรทัดแรกออกจากไฟล์ข้อความขนาดใหญ่โดยใช้สคริปต์ทุบตี ตอนนี้ฉันกำลังใช้sed -i -e "1d" $FILE- แต่ใช้เวลาประมาณหนึ่งนาทีในการลบ มีวิธีที่มีประสิทธิภาพมากกว่านี้หรือไม่
554 bash  scripting  sed 

8
เปรียบเทียบตัวเลขใน Bash
ฉันเริ่มเรียนรู้เกี่ยวกับการเขียนสคริปต์สำหรับเทอร์มินัล bash แต่ฉันไม่สามารถหาวิธีการเปรียบเทียบเพื่อให้ทำงานได้อย่างถูกต้อง สคริปต์ที่ฉันใช้คือ: echo "enter two numbers"; read a b; echo "a=$a"; echo "b=$b"; if [ $a \> $b ]; then echo "a is greater than b"; else echo "b is greater than a"; fi; ปัญหาคือว่ามันเปรียบเทียบตัวเลขจากตัวเลขหลักแรกคือ 9 คือมากกว่า 10 แต่ 1 มากกว่า 09 ฉันจะแปลงตัวเลขเป็นประเภทเพื่อทำการเปรียบเทียบจริงได้อย่างไร
546 bash  shell  numeric 

5
เหตุใดบางครั้งช่องว่างจึงจำเป็นต้องใช้กับอักขระเมตา
ไม่กี่เดือนที่ผ่านมาฉันสักรอยแยกระเบิดที่แขนของฉันและข้ามช่องว่างเพราะฉันคิดว่ามันดูดีกว่าถ้าไม่มีพวกเขา แต่สำหรับความกลัวของฉันบางครั้ง (ไม่เสมอไป) เมื่อฉันเรียกใช้ในเชลล์มันไม่ได้เริ่มวางระเบิด แต่มันก็แค่ทำให้เกิดข้อผิดพลาดทางไวยากรณ์ bash: syntax error near unexpected token `{:' เมื่อวานมันเกิดขึ้นเมื่อฉันพยายามเรียกใช้ในBash shell ของเพื่อนแล้วฉันก็เพิ่มช่องว่างและมันก็ใช้งานได้ทันที:(){ :|:& };:แทนที่จะเป็น:(){:|:&};: ช่องว่างสำคัญหรือไม่ มีรอยสักข้อผิดพลาดทางไวยากรณ์ที่แขนของฉัน?! ดูเหมือนว่าจะทำงานในzshเสมอแต่ไม่ใช่ใน Bash คำถามที่เกี่ยวข้องไม่ได้อธิบายอะไรเกี่ยวกับช่องว่างซึ่งเป็นคำถามของฉันจริงๆ เหตุใดช่องว่างจึงจำเป็นสำหรับ Bash เพื่อให้สามารถแยกวิเคราะห์ได้อย่างถูกต้อง

9
ฉันจะเขียน stderr ไปยังไฟล์ในขณะที่ใช้“ tee” กับไพพ์ได้อย่างไร?
ฉันรู้วิธีใช้teeเพื่อเขียนผลลัพธ์ ( STDOUT) ของaaa.shถึงbbb.outในขณะที่ยังคงแสดงใน terminal: ./aaa.sh | tee bbb.out ฉันจะเขียนSTDERRไฟล์ที่ชื่อccc.outในขณะที่ยังคงแสดงไฟล์ได้อย่างไร
541 linux  bash  unix 


21
วิธีการตรวจสอบระบบปฏิบัติการจากสคริปต์ทุบตี?
ฉันต้องการเก็บไฟล์ของฉัน.bashrcและ.bash_loginไฟล์ต่าง ๆ ไว้ในการควบคุมเวอร์ชันเพื่อให้สามารถใช้งานได้ระหว่างคอมพิวเตอร์ทุกเครื่องที่ฉันใช้ ปัญหาคือฉันมีนามแฝงเฉพาะของระบบปฏิบัติการบางตัวดังนั้นฉันจึงหาวิธีที่จะตรวจสอบว่าสคริปต์นั้นทำงานบน Mac OS X, Linux หรือCygwinหรือไม่ เป็นวิธีที่เหมาะสมในการตรวจสอบระบบปฏิบัติการในสคริปต์Bashอะไร
525 bash  os-detection 

5
คำสั่งไม่พบข้อผิดพลาดในการกำหนดตัวแปร Bash
ฉันมีสคริปต์นี้ชื่อ test.sh: #!/bin/bash STR = "Hello World" echo $STR เมื่อฉันวิ่ง sh test.shฉันจะได้รับสิ่งนี้: test.sh: line 2: STR: command not found ผมทำอะไรผิดหรือเปล่า? ฉันมองไปที่พื้นฐานมาก / ผู้เริ่มต้นบทเรียนการเขียนสคริปต์ทุบตีออนไลน์และนี่คือวิธีที่พวกเขาพูดเพื่อประกาศตัวแปร ... ดังนั้นฉันไม่แน่ใจว่าสิ่งที่ฉันทำผิด ฉันใช้ Ubuntu Server 9.10 /bin/bashและใช่ทุบตีตั้งอยู่ที่

10
จะแบ่งไฟล์ข้อความขนาดใหญ่เป็นไฟล์ขนาดเล็กลงด้วยจำนวนบรรทัดเท่ากันได้อย่างไร
ฉันมีไฟล์ข้อความธรรมดาขนาดใหญ่ (ตามจำนวนบรรทัด) ที่ฉันต้องการแยกเป็นไฟล์ขนาดเล็กลงเช่นกันตามจำนวนบรรทัด ดังนั้นหากไฟล์ของฉันมีประมาณ 2M บรรทัดฉันต้องการแยกมันเป็น 10 ไฟล์ที่มี 200k lines หรือ 100 ไฟล์ที่มี 20k lines (บวกหนึ่งไฟล์ที่มีส่วนที่เหลือการแบ่งเท่ากันไม่สำคัญ) ฉันสามารถทำสิ่งนี้ได้อย่างง่ายดายใน Python แต่ฉันสงสัยว่ามีวิธีใดในการทำเช่นนี้โดยใช้ bash และ unix utils (ซึ่งต่างจากการวนซ้ำด้วยตนเอง
515 bash  file  unix 

28
ตั้งค่าตัวแปรสภาพแวดล้อมจากไฟล์ของคู่คีย์ / ค่า
TL; DR:ฉันจะส่งออกชุดของคู่คีย์ / ค่าจากไฟล์ข้อความไปยังสภาพแวดล้อมของเชลล์ได้อย่างไร สำหรับบันทึกด้านล่างเป็นคำถามต้นฉบับพร้อมตัวอย่าง ฉันกำลังเขียนสคริปต์ใน bash ซึ่งแยกวิเคราะห์ไฟล์ด้วย 3 ตัวแปรในโฟลเดอร์หนึ่งนี่คือหนึ่งในนั้น: MINIENTREGA_FECHALIMITE="2011-03-31" MINIENTREGA_FICHEROS="informe.txt programa.c" MINIENTREGA_DESTINO="./destino/entrega-prac1" ไฟล์นี้ถูกเก็บไว้ใน. /conf/prac1 สคริปต์ minientrega.sh ของฉันแยกวิเคราะห์ไฟล์โดยใช้รหัสนี้: cat ./conf/$1 | while read line; do export $line done แต่เมื่อฉันรันminientrega.sh prac1ในบรรทัดคำสั่งมันไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม ฉันลองใช้ด้วยsource ./conf/$1แต่ปัญหาเดิมยังคงมีอยู่ อาจมีวิธีอื่นในการทำเช่นนี้ฉันเพียงแค่ต้องใช้ตัวแปรสภาพแวดล้อมของไฟล์ที่ฉันส่งเป็นอาร์กิวเมนต์ของสคริปต์ของฉัน

19
Colorized grep - ดูไฟล์ทั้งหมดด้วยการจับคู่ที่ไฮไลต์
ฉันพบgrep's--color=alwaysธงที่จะเป็นประโยชน์อย่างมาก อย่างไรก็ตาม grep พิมพ์เฉพาะบรรทัดที่มีการจับคู่เท่านั้น (ยกเว้นกรณีที่คุณขอบรรทัดบริบท) เนื่องจากแต่ละบรรทัดที่พิมพ์มีการจับคู่การไฮไลต์ไม่ได้เพิ่มความสามารถให้มากที่สุดเท่าที่จะทำได้ ฉันต้องการcatไฟล์จริงๆและดูไฟล์ทั้งหมดที่มีการจับคู่รูปแบบที่เน้นไว้ มีวิธีที่ฉันสามารถบอก grep ให้พิมพ์ทุกบรรทัดที่อ่านไม่ว่าจะมีการแข่งขันหรือไม่? ฉันรู้ว่าฉันสามารถเขียนสคริปต์เพื่อรัน grep ในทุกบรรทัดของไฟล์ แต่ฉันอยากรู้ว่าสิ่งนี้เป็นไปได้ด้วยมาตรฐานgrepหรือไม่
509 bash  shell  colors  grep 

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