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

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

7
ข้อผิดพลาด RE: ลำดับไบต์ที่ผิดกฎหมายบน Mac OS X
ฉันกำลังพยายามแทนที่สตริงใน Makefile บน Mac OS X สำหรับการคอมไพล์ข้ามเป็น iOS สตริงมีเครื่องหมายคำพูดคู่ฝังอยู่ คำสั่งคือ: sed -i "" 's|"iphoneos-cross","llvm-gcc:-O3|"iphoneos-cross","clang:-Os|g' Configure และข้อผิดพลาดคือ: sed: RE error: illegal byte sequence ฉันได้ลองใช้เครื่องหมายคำพูดคู่เครื่องหมายจุลภาคขีดคั่นและเครื่องหมายทวิภาคโดยไม่มีความสุข ตัวอย่างเช่น: sed -i "" 's|\"iphoneos-cross\"\,\"llvm-gcc\:\-O3|\"iphoneos-cross\"\,\"clang\:\-Os|g' Configure ฉันมีเวลาสักครู่ในการดีบักปัญหา ไม่มีใครรู้วิธีการsedพิมพ์ตำแหน่งของลำดับไบต์ที่ผิดกฎหมายหรือไม่ หรือใครรู้ว่าลำดับไบต์ที่ผิดกฎหมายคืออะไร?
184 regex  macos  bash  sed 

6
วนรอบอาร์เรย์พิมพ์ทั้งดัชนีและค่า
ฉันต้องการทำสิ่งนี้: foo=( ) foo[0]="bar" foo[35]="baz" for((i=0;i<${#foo[@]};i++)) do echo "$i: ${foo[$i]}" done # Output: # 0: bar # 1: จากนั้นฉันพยายามวนผ่านมันเพื่อใช้ใน: foo=( ) foo[0]="bar" foo[35]="baz" for i in ${foo[@]} do echo "?: $i" done # Output: # ?: bar # ?: naz แต่ตรงนี้ฉันไม่รู้ค่าดัชนี ฉันรู้ว่าคุณสามารถทำอะไรบางอย่างเช่น foo=( ) foo[0]="bar" foo[35]="baz" declare -p foo # …
184 bash 

14
ดำเนินการสคริปต์ทุบตีจาก URL
บอกว่าฉันมีไฟล์ที่ URL "http://mywebsite.com/myscript.txt" ที่มีสคริปต์: #!/bin/bash echo "Hello, world!" read -p "What is your name? " name echo "Hello, ${name}!" และฉันต้องการเรียกใช้สคริปต์นี้โดยไม่บันทึกเป็นไฟล์ก่อน ฉันจะทำสิ่งนี้ได้อย่างไร ตอนนี้ฉันได้เห็นไวยากรณ์: bash < <(curl -s http://mywebsite.com/myscript.txt) แต่ดูเหมือนว่ามันจะไม่ทำงานถ้าหากฉันบันทึกลงไฟล์แล้วก็ดำเนินการ เช่น readline ไม่ทำงานและผลลัพธ์เป็นเพียง: $ bash < <(curl -s http://mywebsite.com/myscript.txt) Hello, world! ฉันได้ลอง: curl -s http://mywebsite.com/myscript.txt | bash -s -- ด้วยผลลัพธ์เดียวกัน เดิมทีฉันมีวิธีแก้ปัญหาเช่น: timestamp=`date …
184 linux  bash  curl 

10
จะตรวจสอบว่าไฟล์นั้นว่างเปล่าใน Bash ได้อย่างไร?
ฉันมีไฟล์ชื่อ diff.txt ต้องการตรวจสอบว่าว่างเปล่าหรือไม่ ทำสิ่งนี้ แต่ไม่สามารถทำงานได้ if [ -s diff.txt ] then touch empty.txt rm full.txt else touch full.txt rm emtpy.txt fi

5
เมื่อใดจึงควรใส่เครื่องหมายคำพูดล้อมรอบตัวแปรเชลล์
มีใครบางคนบอกฉันว่าฉันควรจะใส่เครื่องหมายคำพูดล้อมรอบตัวแปรในเชลล์สคริปต์หรือไม่ ตัวอย่างเช่นแก้ไขต่อไปนี้: xdg-open $URL [ $? -eq 2 ] หรือ xdg-open "$URL" [ "$?" -eq "2" ] และถ้าเป็นเช่นนั้นทำไม
184 linux  bash  shell  unix  quotes 

13
วิธีใดก็ตามที่จะออกจากสคริปต์ทุบตี แต่ไม่ออกจากสถานี
เมื่อฉันใช้exitคำสั่งในเชลล์สคริปต์สคริปต์จะยุติเทอร์มินัล (พรอมต์) มีวิธีใดบ้างที่จะยกเลิกสคริปต์และพักอยู่ในอาคารได้? สคริปต์ของฉันrun.shคาดว่าจะดำเนินการโดยการจัดหาโดยตรงหรือมาจากสคริปต์อื่น แก้ไข: เพื่อให้เฉพาะเจาะจงมากขึ้นมีสองสคริปต์run2.shเป็น ... . run.sh echo "place A" ... และrun.shเป็น ... exit ... เมื่อฉันเรียกใช้โดย. run2.shและถ้ามันชนexitcodeline ในrun.shฉันต้องการให้หยุดที่สถานีและอยู่ที่นั่น แต่การใช้exitเทอร์มินัลทั้งหมดจะถูกปิด PS: ฉันพยายามใช้returnแล้ว แต่echocodeline จะยังคงได้รับการดำเนินการ ....
183 linux  bash 

2
บันทึกไฟล์ไปยังโฟลเดอร์เฉพาะด้วยคำสั่ง curl
ในเชลล์สคริปต์ฉันต้องการดาวน์โหลดไฟล์จากบาง URL และบันทึกลงในโฟลเดอร์เฉพาะ อะไรคือการตั้งค่าสถานะ CLI เฉพาะที่ฉันควรใช้เพื่อดาวน์โหลดไฟล์ไปยังโฟลเดอร์เฉพาะด้วยcurlคำสั่งหรือฉันจะได้รับผลลัพธ์นั้นได้อย่างไร?
182 bash  shell  curl  directory 

7
ลบบรรทัดทั้งหมดที่ขึ้นต้นด้วย # จากไฟล์
#ทุกสายที่มีความคิดเห็นในไฟล์ที่เริ่มต้นด้วย ฉันจะลบบรรทัดทั้งหมด (และเฉพาะบรรทัดเหล่านั้น) ที่เริ่มต้นด้วยได้#อย่างไร บรรทัดอื่นที่มี#แต่ไม่ใช่ที่จุดเริ่มต้นของบรรทัดควรละเว้น
182 bash  sed 

5
ฉันจะหาจำนวนข้อโต้แย้งที่ส่งผ่านไปยังสคริปต์ Bash ได้อย่างไร
ฉันจะหาจำนวนข้อโต้แย้งที่ส่งผ่านไปยังสคริปต์ Bash ได้อย่างไร นี่คือสิ่งที่ฉันมีในปัจจุบัน: #!/bin/bash i=0 for var in "$@" do i=i+1 done มีวิธีอื่นในการทำเช่นนี้อีกหรือไม่
182 bash  arguments 

6
ทดสอบสตริงที่มีความยาวไม่เป็นศูนย์ใน Bash: [-n“ $ var”] หรือ [“ $ var”]
ฉันเคยเห็นสคริปต์ Bash ทดสอบสตริงที่มีความยาวไม่เป็นศูนย์ในสองวิธีที่แตกต่างกัน สคริปต์ส่วนใหญ่ใช้-nตัวเลือก: #!/bin/bash # With the -n option if [ -n "$var" ]; then # Do something when var is non-zero length fi แต่ตัวเลือก -n ไม่จำเป็นต้องใช้: # Without the -n option if [ "$var" ]; then # Do something when var is non-zero length fi วิธีไหนดีกว่ากัน? ในทำนองเดียวกันซึ่งเป็นวิธีที่ดีกว่าสำหรับการทดสอบความยาวเป็นศูนย์: if …

18
วิธีเก็บข้อผิดพลาดมาตรฐานในตัวแปร
สมมติว่าฉันมีสคริปต์ดังต่อไปนี้: useless.sh echo "This Is Error" 1>&2 echo "This Is Output" และฉันมีเชลล์สคริปต์อีกอันหนึ่ง: alsoUseless.sh ./useless.sh | sed 's/Output/Useless/' ฉันต้องการจับภาพ "นี่คือข้อผิดพลาด" หรือ stderr อื่น ๆ จาก useless.sh ไปเป็นตัวแปร ลองเรียกมันว่า ERROR สังเกตว่าฉันกำลังใช้ stdout สำหรับบางสิ่ง ฉันต้องการใช้ stdout ต่อไปดังนั้นการเปลี่ยนเส้นทาง stderr ไปยัง stdout จะไม่เป็นประโยชน์ในกรณีนี้ โดยพื้นฐานแล้วฉันต้องการจะทำ ./useless.sh 2> $ERROR | ... แต่เห็นได้ชัดว่าใช้งานไม่ได้ ฉันก็รู้ว่าฉันสามารถทำได้ ./useless.sh 2> /tmp/Error ERROR=`cat …


16
วิธีการเริ่มต้นไดเรกทอรีอื่นแทนไดเรกทอรีบ้าน
Наэтотвопросестьответына Stack Overflow нарусском : Git Bash изменитьдомашнийкаталог ฉันกำลังพัฒนาบนเครื่องที่ใช้ windows ที่เดียวที่ฉันต้องการสำหรับบรรทัดคำสั่ง linux คือ Git Bash ปัญหาคือ: เมื่อฉันเปิดมันฉันอยู่ในไดเรกทอรีบ้าน ฉันต้องเปลี่ยนไดเรกทอรีเป็นพื้นที่ทำงานของฉันเช่น: cd ../../../d/work_space_for_my_company/project/code_source ฉันสามารถรวมไฟล์นี้เป็นไฟล์. sh ดังนั้นฉันไม่ต้องพิมพ์ด้วยมืออีกต่อไปหรือไม่ ควรจะง่าย แต่ฉันไม่มีความรู้เกี่ยวกับบรรทัดคำสั่ง Linux ฉันชื่นชมจริงๆถ้าคุณสามารถแนะนำวิธีการสร้างไฟล์. sh
180 bash  shell  git-bash 


5
วิธีการเปลี่ยนเส้นทาง stderr และ stdout ไปยังไฟล์ต่าง ๆ ในบรรทัดเดียวกันในสคริปต์?
ฉันรู้สิ่งนี้มาก: $ command 2>> error $ command 1>> output มีวิธีใดบ้างที่ฉันสามารถส่งออก stderr ไปยังไฟล์ข้อผิดพลาดและเอาต์พุต stdout ไปยังไฟล์เอาต์พุตใน bash บรรทัดเดียวกัน?
180 linux  bash 

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