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

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

30
วิธีรับไดเรกทอรีซอร์สของสคริปต์ Bash จากภายในสคริปต์นั้น
ฉันจะรับพา ธ ของไดเรกทอรีที่สคริปต์Bashอยู่ภายในสคริปต์นั้นได้อย่างไร ฉันต้องการใช้สคริปต์ Bash เป็นตัวเรียกใช้งานสำหรับแอปพลิเคชันอื่น ฉันต้องการเปลี่ยนไดเรกทอรีการทำงานเป็นไดเรกทอรี Bash script ดังนั้นฉันสามารถทำงานกับไฟล์ในไดเรกทอรีนั้นได้เช่น: $ ./application
4950 bash  directory 


20
ฉันจะบอกได้อย่างไรว่าไฟล์ปกติไม่มีอยู่ใน Bash
ฉันใช้สคริปต์ต่อไปนี้เพื่อดูว่ามีไฟล์อยู่หรือไม่: #!/bin/bash FILE=$1 if [ -f $FILE ]; then echo "File $FILE exists." else echo "File $FILE does not exist." fi อะไรไวยากรณ์ที่ถูกต้องที่จะใช้ถ้าฉันเพียงต้องการตรวจสอบว่าไฟล์ไม่ได้อยู่? #!/bin/bash FILE=$1 if [ $FILE does not exist ]; then echo "File $FILE does not exist." fi
3261 bash  file-io  scripting 


26
วิธีการตรวจสอบว่าสตริงมีสตริงย่อยใน Bash
ฉันมีสตริงใน Bash: string="My string" ฉันจะทดสอบว่ามันมีสตริงอื่นได้อย่างไร? if [ $string ?? 'foo' ]; then echo "It's there!" fi ??ตัวดำเนินการที่ไม่รู้จักของฉันอยู่ที่ไหน ฉันใช้เสียงสะท้อนgrepหรือไม่? if echo "$string" | grep 'foo'; then echo "It's there!" fi ที่ดูเหมือนเงอะงะเล็กน้อย
2566 string  bash  shell  substring  sh 


17
ในเปลือกหอย“ 2> & 1” หมายถึงอะไร
ในเปลือก Unix ถ้าผมต้องการที่จะรวมstderrและstdoutเข้าสู่stdoutกระแสสำหรับการจัดการต่อไปผมสามารถผนวกต่อไปนี้ในตอนท้ายของคำสั่งของฉัน: 2>&1 ดังนั้นถ้าฉันต้องการใช้headกับผลลัพธ์จากg++ฉันสามารถทำสิ่งนี้: g++ lots_of_errors 2>&1 | head ดังนั้นฉันสามารถเห็นข้อผิดพลาดเพียงสองสามข้อแรกเท่านั้น ฉันมักจะมีปัญหาในการจดจำสิ่งนี้และฉันต้องค้นหามันอย่างต่อเนื่องและส่วนใหญ่เป็นเพราะฉันไม่เข้าใจไวยากรณ์ของเคล็ดลับนี้โดยเฉพาะ คนที่สามารถทำลายนี้และอธิบายทีละอักขระสิ่งที่2>&1 หมายถึง?
2282 bash  shell  unix  redirect 

30
ฉันจะตรวจสอบว่าโปรแกรมนั้นมีอยู่จากสคริปต์ Bash ได้อย่างไร
ฉันจะตรวจสอบว่าโปรแกรมมีอยู่ในวิธีที่จะส่งคืนข้อผิดพลาดและออกหรือดำเนินการต่อกับสคริปต์ได้อย่างไร ดูเหมือนว่ามันควรจะง่าย แต่มันทำให้ฉันนิ่งงัน
2209 bash 

30
แยกชื่อไฟล์และนามสกุลใน Bash
ฉันต้องการรับชื่อไฟล์ (ไม่มีส่วนขยาย) และส่วนขยายแยกต่างหาก ทางออกที่ดีที่สุดที่ฉันพบคือ: NAME=`echo "$FILE" | cut -d'.' -f1` EXTENSION=`echo "$FILE" | cut -d'.' -f2` สิ่งนี้ผิดเพราะใช้งานไม่ได้หากชื่อไฟล์มี.อักขระหลายตัว ถ้าสมมติว่าผมมีa.b.jsก็จะพิจารณาaและb.jsแทนและa.bjs สามารถทำได้อย่างง่ายดายใน Python ด้วย file, ext = os.path.splitext(path) แต่ฉันไม่ต้องการที่จะไล่ล่าล่ามงูใหญ่สำหรับเรื่องนี้ถ้าเป็นไปได้ มีความคิดที่ดีกว่านี้ไหม?
2105 bash  string  filenames 

30
ฉันจะแยกสตริงบนตัวคั่นใน Bash ได้อย่างไร
ฉันมีสตริงนี้เก็บไว้ในตัวแปร: IN="bla@some.com;john@home.com" ตอนนี้ฉันต้องการแยกสตริงด้วย;ตัวคั่นเพื่อให้ฉันมี: ADDR1="bla@some.com" ADDR2="john@home.com" ฉันไม่ต้องการADDR1และADDR2ตัวแปร หากพวกเขาเป็นองค์ประกอบของอาเรย์ที่ดียิ่งขึ้น หลังจากข้อเสนอแนะจากคำตอบด้านล่างฉันลงเอยด้วยสิ่งต่อไปนี้ซึ่งเป็นสิ่งที่ฉันเป็นหลังจาก: #!/usr/bin/env bash IN="bla@some.com;john@home.com" mails=$(echo $IN | tr ";" "\n") for addr in $mails do echo "> [$addr]" done เอาท์พุท: > [bla@some.com] > [john@home.com] มีวิธีการแก้ปัญหาที่เกี่ยวข้องกับการตั้งค่าเป็นInternal_field_separator (ไอเอฟเอ) ;เพื่อ ฉันไม่แน่ใจว่าเกิดอะไรขึ้นกับคำตอบนั้นคุณจะรีเซ็ตอย่างไรIFSกลับเป็นค่าเริ่มต้นได้อย่างไร RE: IFSวิธีแก้ปัญหาฉันลองใช้ดูแล้วมันได้ผลฉันใช้รุ่นเก่าIFSแล้วคืนค่า: IN="bla@some.com;john@home.com" OIFS=$IFS IFS=';' mails2=$IN for x in $mails2 do echo "> [$x]" done …
2041 bash  shell  split  scripting 

30
ฉันจะแยกอาร์กิวเมนต์บรรทัดคำสั่งใน Bash ได้อย่างไร
บอกฉันว่าฉันมีสคริปต์ที่ถูกเรียกด้วยบรรทัดนี้: ./myscript -vfd ./foo/bar/someFile -o /fizz/someOtherFile หรืออันนี้: ./myscript -v -f -d -o /fizz/someOtherFile ./foo/bar/someFile เป็นวิธีที่ได้รับการยอมรับของการแยกเช่นนี้ว่าในแต่ละกรณี (หรือการรวมกันของทั้งสองบางคน) $v, $fและ $dทั้งหมดจะถูกตั้งค่าtrueและ$outFileจะเท่ากับ/fizz/someOtherFile?


14
ฉันจะตั้งค่าตัวแปรเป็นผลลัพธ์ของคำสั่งใน Bash ได้อย่างไร
ฉันมีสคริปต์ที่ค่อนข้างง่ายและมีลักษณะดังนี้: #!/bin/bash VAR1="$1" MOREF='sudo run command against $VAR1 | grep name | cut -c7-' echo $MOREF เมื่อฉันเรียกใช้สคริปต์นี้จากบรรทัดคำสั่งและส่งผ่านข้อโต้แย้งฉันไม่ได้รับผลลัพธ์ใด ๆ อย่างไรก็ตามเมื่อฉันรันคำสั่งที่มีอยู่ภายใน$MOREFตัวแปรฉันสามารถรับเอาต์พุตได้ เราจะนำผลลัพธ์ของคำสั่งที่จำเป็นต้องใช้ในสคริปต์บันทึกไปยังตัวแปรแล้วส่งออกตัวแปรนั้นบนหน้าจอได้อย่างไร
1676 bash  shell  command-line 


30
วิธีการนับบรรทัดของรหัสทั้งหมดในไดเรกทอรีซ้ำ?
เรามีแอปพลิเคชั่น PHP และต้องการนับจำนวนบรรทัดทั้งหมดภายใต้ไดเรกทอรีเฉพาะและไดเรกทอรีย่อย เราไม่จำเป็นต้องเพิกเฉยต่อความคิดเห็นเนื่องจากเรากำลังพยายามทำความเข้าใจคร่าวๆ wc -l *.php คำสั่งนั้นใช้งานได้ดีในไดเรกทอรีที่กำหนด แต่ไม่สนใจไดเรกทอรีย่อย ฉันคิดว่ามันอาจใช้งานได้ แต่มันกลับมา 74 ซึ่งไม่ใช่กรณี ... find . -name '*.php' | wc -l ไวยากรณ์ที่ถูกต้องในฟีดคืออะไร?
1623 bash  shell 

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