คำถามติดแท็ก shell-script

คำถามเกี่ยวกับเชลล์สคริปต์ไฟล์เรียกทำงานที่ตีความโดยเชลล์ (bash, zsh ฯลฯ )

6
Trap, ERR และ echoing บรรทัดข้อผิดพลาด
ฉันกำลังพยายามสร้างการรายงานข้อผิดพลาดโดยใช้ Trap เพื่อเรียกใช้ฟังก์ชันกับข้อผิดพลาดทั้งหมด: Trap "_func" ERR เป็นไปได้ไหมที่จะรับสัญญาณ ERR ที่เป็นเส้นตรง? เปลือกเป็นทุบตี หากฉันทำเช่นนั้นฉันสามารถอ่านและรายงานคำสั่งที่ใช้และบันทึก / ดำเนินการบางอย่าง หรือบางทีฉันอาจจะทำผิดทั้งหมดนี้? ฉันทดสอบกับสิ่งต่อไปนี้: #!/bin/bash trap "ECHO $LINENO" ERR echo hello | grep "asdf" และ$LINENOกำลังกลับมา 2 ไม่ทำงาน


5
ตรวจสอบว่า $ REPLY อยู่ในช่วงตัวเลขหรือไม่
ฉันเขียนเชลล์สคริปต์สำหรับ Linux โดยใช้ Bash เพื่อแปลไฟล์วิดีโอใด ๆ ให้เป็น MP4 สำหรับสิ่งที่ฉันใช้avconvกับlibvorbisเสียง ภายในสคริปต์ของฉันฉันมีคำถามสำหรับผู้ใช้: read -p "- Audio Quality [scale from -2 to 10] ? " if [ -n "$REPLY" ] ; then ABITRATE="-aq $REPLY" fi สตริง "ABITRATE" ของฉันเข้าสู่avconvบรรทัดคำสั่งสุดท้าย แต่ฉันต้องการให้ผู้ใช้มีโอกาสตอบคำถามนั้นด้วยค่าเป็น Kb (Kilobit) และแปลเป็นมาตราส่วนที่libvorbisใช้ "สเกลจาก -2 ถึง 10" คือ: Quality Kbit/s Normalization ----------------------------- -2 ~32 …

8
ทดสอบว่ามีไฟล์ที่ตรงกับรูปแบบเพื่อเรียกใช้สคริปต์หรือไม่
ฉันพยายามเขียนifคำสั่งเพื่อทดสอบว่ามีไฟล์ใดที่ตรงกับรูปแบบที่กำหนดหรือไม่ หากมีไฟล์ข้อความในไดเรกทอรีควรเรียกใช้สคริปต์ที่กำหนด รหัสของฉันในปัจจุบัน: if [ -f /*.txt ]; then ./script fi โปรดให้แนวคิดบางอย่าง; ฉันต้องการเรียกใช้สคริปต์หากมีอยู่.txtในไดเรกทอรีเท่านั้น

1
ทุบตีคำสั่งกรณีน้ำตกทั้งหมด?
ฉันพยายามทำสิ่งนี้: case $level in 3) echo "Level Three" 2) echo "Level Two" 1) echo "Level one" ;; esac โดยที่ถ้าระดับ $ = 3 มันจะส่งออก Level Three Level Two Level One ในขณะที่ถ้า $ level = 1 มันจะออกเท่านั้น Level One แต่เมื่อผมลองแล้วฉันจะได้รับข้อผิดพลาดเพราะผมไม่ได้รวมsyntax error near unexpected token ')';; ทุกภาษาที่ฉันรู้จักอนุญาตให้ทำสิ่งนี้มีวิธีที่จะทำได้ในการทุบตีหรือไม่? คำหลักบางประเภทที่หมายถึง "ตอนนี้ไปและทำกรณีถัดไปราวกับว่ามันตรงกับ"?

2
วิธีกำหนดเอาต์พุต cat ของสคริปต์ bash ให้กับตัวแปรในสคริปต์อื่น
ฉันมีสคริปต์ทุบตีที่สร้างเอาต์พุต cat เมื่อมีการโต้แย้ง ฉันยังมีสคริปต์ทุบตีอีกตัวหนึ่งที่เรียกใช้งานสคริปต์ทุบตีแรกด้วยอาร์กิวเมนต์ที่ฉันต้องการสร้างผลงาน cat ด้วย ฉันจะเก็บ cat เอาต์พุตที่สร้างโดยสคริปต์ทุบตีแรกในตัวแปรได้อย่างไร

7
วิธีพกพาเพื่อรับเส้นทางที่สมบูรณ์ของสคริปต์
เป็นวิธีแบบพกพาสำหรับสคริปต์ (zsh) เพื่อกำหนดเส้นทางที่แน่นอนคืออะไร? บน Linux ฉันใช้สิ่งที่ชอบ mypath=$(readlink -f $0) ... แต่นี่ไม่ใช่แบบพกพา (เช่นreadlinkในดาร์วินไม่รู้จัก-fธงและไม่มีอะไรเทียบเท่า) (เช่นเดียวกับการใช้readlinkสิ่งนี้คือเป็นที่ยอมรับว่าเป็นแฮ็คที่ดูคลุมเครือ) อะไรคือวิธีพกพาที่มากขึ้น?

4
การจัดตำแหน่งสคริปต์ Bash shell
สคริปต์ของฉัน: date echo -e "${YELLOW}Network check${NC}\n\n" while read hostname do ping -c 1 "$hostname" > /dev/null 2>&1 && echo -e "Network $hostname : ${GREEN}Online${NC}" || echo -e "${GRAY}Network $hostname${NC} : ${RED}Offline${NC}" done < list.txt sleep 30 clear done กำลังแสดงผลข้อมูลเช่นนี้: Network 10.x.xx.xxx : Online Network 10.x.xx.xxx : Offline Network 10.x.xx.xxx : …

4
จะสร้างไฟล์ชั่วคราวใน RAM ได้อย่างไร?
|tee scriptnameYYMMDD.txtฉันมีสคริปต์ที่จะท่อส่งออกไปยัง หลังจากแต่ละรอบของ for for loop ที่สร้างเอาต์พุตขึ้นมาฉันจะย้อนกลับเนื้อหาไฟล์ด้วยtac scriptnameYYYYMMDD.txt > /var/www/html/logs/scriptname.txtเพื่อให้สามารถเห็นเอาต์พุตบันทึกในหน้าต่างเบราว์เซอร์ที่มีบรรทัดใหม่ล่าสุดอยู่ด้านบน ฉันจะมีสคริปต์หลายตัวที่ทำสิ่งนี้ควบคู่กัน ฉันพยายามลดกิจกรรมของดิสก์ให้น้อยที่สุดดังนั้นผลลัพธ์จาก|tee scriptnameYYYYMMDD.txtRAMdisk จะดีที่สุด mktempสร้างไฟล์ใน/tmpโฟลเดอร์ แต่ไม่ปรากฏว่าเป็นดิสก์

3
การใช้ sed เพื่อระบายสีเอาต์พุตจากคำสั่งบน solaris
ฉันมีสคริปต์ ksh ที่ต้องทำงานกับทั้ง linux และ solaris ฉันกำลังพยายามระบายสีผลลัพธ์ของคำสั่งเฉพาะ ใช้งานได้กับ linux (โดยเฉพาะ RHEL6) แต่ไม่ใช้กับ Solaris (SunOS 5.10) คำสั่งบน linux (ผลลัพธ์ "test" เป็นสีแดงที่ถูกต้อง): [amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,' test คำสั่งเกี่ยวกับโซลาริส (ผลลัพธ์ "การทดสอบ" ไม่มีสี) [amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,' x1B[31mtestx1B[0m มีวิธีการสร้างคำสั่งนี้ว่าเอาท์พุทเป็นสีแดงโดยไม่ต้องรหัสดิบในการส่งออก? ฉันไม่สามารถเปลี่ยนคำสั่ง 'echo' ได้เพราะนั่นเป็นเพียงการกรอกคำสั่งที่ฉันใช้อยู่

3
`{{(ออก 1) อะไร ทางออก 1; }; } `หมายถึงอะไร
ผมยกมาข้อมูลโค้ดต่อไปจากที่สร้างขึ้นโดยconfig.statusconfigure if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi ในข้อมูลโค้ดจะ{ (exit 1); exit 1; };ทำอย่างไร จุดประสงค์ของการทำเพียงแค่exitใน subshell คืออะไร

5
ทำไมฉันต้องวาง "ทำ" ในบรรทัดเดียวกันกับ "สำหรับ"
1. สรุป ผมไม่เข้าใจว่าทำไมฉันต้องกฎ bashate E010 2. รายละเอียด ฉันใช้bashateสำหรับการตัด.shไฟล์ กฎ E010: ทำไม่ได้อยู่ในสายเดียวกับสำหรับ for bashate: แก้ไข: #!/bin/bash for f in bash/*.sh; do sashacommand "$f" done ข้อผิดพลาด: #!/bin/bash for f in bash/*.sh do sashacommand "$f" done เหตุผลใดที่ฉันต้องการforและdoอยู่ในบรรทัดเดียวกัน 3. ไม่มีประโยชน์ ฉันไม่พบคำตอบสำหรับคำถามของฉันใน: Google บทความเกี่ยวกับแนวทางปฏิบัติในการเข้ารหัสที่ดีที่สุด ( ตัวอย่าง ) เอกสาร bashate ฉันพบเพียง : ชุดของกฎที่ช่วยให้สิ่งต่าง ๆ สอดคล้องกันในบล็อกควบคุม สิ่งเหล่านี้จะถูกมองข้ามบนเส้นยาวที่มีความต่อเนื่องเพราะการคลายตัวซึ่งเป็น“ …

11
เหตุใดเชลล์จึงไม่แก้ไข“ การใช้แมวที่ไร้ประโยชน์” โดยอัตโนมัติ? [ปิด]
หลายคนใช้ oneliners และสคริปต์ที่มีรหัสตามบรรทัด cat "$MYFILE" | command1 | command2 > "$OUTPUT" ครั้งแรกที่catมักจะเรียกว่า "การใช้ประโยชน์จากแมว" เพราะในทางเทคนิคมันต้องเริ่มต้นกระบวนการใหม่ (มัก/usr/bin/cat) ซึ่งสามารถหลีกเลี่ยงได้ถ้าคำสั่งได้รับ < "$MYFILE" command1 | command2 > "$OUTPUT" เพราะเชลล์จะต้องเริ่มcommand1และชี้stdinไปที่ไฟล์ที่กำหนดเท่านั้น เหตุใดเปลือกจึงไม่ทำการแปลงนี้โดยอัตโนมัติ ฉันรู้สึกว่าไวยากรณ์ "ใช้งานไร้ประโยชน์ของแมว" ง่ายต่อการอ่านและเชลล์ควรมีข้อมูลเพียงพอที่จะกำจัดแมวไร้ประโยชน์โดยอัตโนมัติ catถูกกำหนดไว้ในมาตรฐาน POSIX เพื่อให้เปลือกควรได้รับอนุญาตที่จะใช้มันภายในแทนการใช้ไบนารีในเส้นทาง เชลล์สามารถมีการนำไปใช้งานสำหรับอาร์กิวเมนต์หนึ่งรุ่นเท่านั้นและทางเลือกในการไบนารี

1
bash line จะดำเนินการต่อหลังจาก && และ || เอกสาร?
ฉันได้เห็นโครงสร้างนี้ในสคริปต์จำนวนมากและใช้มันเอง แต่มันทำให้ฉันรำคาญใจที่ฉันไม่สามารถหามันได้ในเอกสารประกอบ ตัวอย่าง: [ -f file1 ] && [ -f file2 ] && echo "Both files exist." || echo "One or the other file doesn't exist." สิ่งนี้สามารถทำได้ด้วยแบ็กสแลชก่อนขึ้นบรรทัดใหม่ดังที่ได้กล่าวไว้ในman bash: If a \<newline> pair appears, and the backslash is not itself quoted, the \<newline> is treated as a line continuation (that is, …

4
ขอบเขตของตัวแปรท้องถิ่นในฟังก์ชั่นเชลล์
หลังจากอ่าน24.2 ตัวแปรท้องถิ่นผมคิดว่าการประกาศตัวแปรvarด้วยคำหลักlocalนั่นหมายความว่าvarค่า 's สามารถเข้าถึงได้เฉพาะภายในบล็อกของรหัสที่คั่นด้วยวงเล็บปีกกาของฟังก์ชั่น อย่างไรก็ตามหลังจากรันตัวอย่างต่อไปนี้ฉันพบว่าvarสามารถเข้าถึงได้อ่านและเขียนจากฟังก์ชั่นที่เรียกใช้โดยบล็อกของรหัสนั้น - เช่นแม้ว่าจะvarถูกประกาศlocalไปouterFuncแล้วinnerFuncก็ยังสามารถอ่านและแก้ไขค่าได้ Run It Online #!/usr/bin/env bash function innerFunc() { var='new value' echo "innerFunc: [var:${var}]" } function outerFunc() { local var='initial value' echo "outerFunc: before innerFunc: [var:${var}]" innerFunc echo "outerFunc: after innerFunc: [var:${var}]" } echo "global: before outerFunc: [var:${var}]" outerFunc echo "global: after outerFunc: [var:${var}]" …

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