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

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

4
ตรรกะและในสคริปต์ทุบตี
ฉันมีifในสคริปต์ทุบตีของฉันที่ต้องตรวจสอบว่า EITHER ของ 2 ไฟล์ที่มีอยู่หากพวกเขาไม่อยู่มันควรจะสะท้อน รหัสฉันมี: if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi แต่นี่ดูเหมือนจะไม่ทำงานด้วยเหตุผลบางอย่าง ฉันแน่ใจว่า 110% ว่าไม่มีไฟล์ 2 ไฟล์นี้ ฉันไม่ได้รับข้อผิดพลาดใด ๆ ifมันก็ไม่ได้ใส่ ฉันยังใหม่กับการเขียนสคริปต์ทุบตีดังนั้นฉันไม่แน่ใจว่าจะเกิดอะไรขึ้น

5
ฉันจะทำโปรไฟล์เชลล์สคริปต์ได้อย่างไร
ฉันมีหลายโปรแกรมที่ฉันเรียกใช้งานในเชลล์สคริปต์: ./myprogram1 ./myprogram2 ... ฉันรู้ว่าฉันสามารถโปรไฟล์แต่ละโปรแกรมโดยแก้ไขซอร์สโค้ด แต่ฉันต้องการทราบว่ามีวิธีที่ฉันสามารถวัดเวลาทั้งหมดที่ดำเนินการโดยการทำโปรไฟล์สคริปต์เองหรือไม่ มีโปรแกรมจับเวลาที่ฉันสามารถใช้เพื่อวัตถุประสงค์นี้หรือไม่? ถ้าเป็นเช่นนั้นการวัดของมันแม่นยำแค่ไหน?

2
ใช้คำสั่ง `select 'เพื่อพิมพ์เมนูใน Bash
ฉันพยายามใช้เมนูอย่างง่ายโดยใช้selectคำสั่ง สคริปต์ (สำหรับจุดประสงค์ในการทดสอบ) มีดังนี้: #!/bin/bash echo "*******************" PS3='Select an option and press Enter: ' options=("apache" "named" "sendmail") select opt in "${options[@]}" do case $opt in "apache") date ;; "named") echo "test" ;; "sendmail") echo "test 2" ;; *) echo "invalid option";; esac done echo "*********************" สคริปต์ไม่รู้จักอินพุตที่ถูกต้องที่ฉันให้และพิมพ์ข้อความ "ตัวเลือกที่ไม่ถูกต้อง" เสมอ เกิดอะไรขึ้นในสคริปต์นี้

1
วิธีผนวกหลายบรรทัดไปยังไฟล์ด้วย bash โดยใช้“ -” ที่หน้าสตริง
คำถามที่คล้ายกันมากกับวิธีต่อท้ายหลายบรรทัดไปยังไฟล์ที่มี bashแต่ฉันต้องการเริ่มต้นไฟล์ด้วย--และผนวกเข้ากับไฟล์ด้วยถ้าเป็นไปได้ printf "--no-color\n--format-doc\n--no-profile\n" >> ~/.rspec-test ปัญหากำลังเริ่มต้นไฟล์ด้วย "-" ให้ฉัน: -bash: printf: --: invalid option printf: usage: printf [-v var] format [arguments] มีวิธีหนี--หรือไม่? มีทางเลือกอื่นอีกไหม? ฉันไม่แน่ใจว่าจะใช้หลายบรรทัดได้echoอย่างไรและcatไม่ใช่ตัวเลือกที่ดีฉันต้องการให้เป็นสคริปต์อัตโนมัติ

1
พยายามเขียนเชลล์สคริปที่ทดสอบเซิร์ฟเวอร์จากระยะไกล แต่มันยังคงอยู่ในคำสั่งอื่นเมื่อฉันออกจากระบบ
ลองที่นี่เพื่อเขียนเชลล์สคริปต์ที่คอยทดสอบเซิร์ฟเวอร์ของฉันและส่งอีเมลถึงฉันเมื่อมันหยุดทำงาน ปัญหาคือว่าเมื่อฉันออกจากระบบจากการเชื่อมต่อ ssh แม้จะใช้มัน&ในตอนท้ายของคำสั่งเช่น./stest01.sh &มันจะตกอยู่ในที่อื่นโดยอัตโนมัติและทำให้ฉันส่งจดหมายต่อเนื่องจนกว่าฉันจะเข้าสู่ระบบอีกครั้งและฆ่ามัน #!/bin/bash while true; do date > sdown.txt ; cp /dev/null pingop.txt ; ping -i 1 -c 1 -W 1 myserver.net > pingop.txt & sleep 1 ; if grep "64 bytes" pingop.txt ; then : else mutt -s "Server Down!" myemail@address.com < sdown.txt ; sleep 10 …

4
ประสิทธิภาพของลูปเทียบกับการขยาย
ต้องการคำแนะนำจากผู้เชี่ยวชาญในการเปรียบเทียบด้านล่าง: ส่วนของรหัสโดยใช้ลูป: for file in `cat large_file_list` do gzip -d $file done ส่วนของรหัสโดยใช้การขยายอย่างง่าย: gzip -d `cat large_file_list` อันไหนจะเร็วกว่ากัน? ต้องจัดการกับชุดข้อมูลขนาดใหญ่

3
ฉันจะป้องกันไม่ให้ตัวเลือก 'shopt' ไม่สนับสนุนการทำให้เกิดข้อผิดพลาดใน. bashrc ของฉันได้อย่างไร
ฉันทำงานในสภาพแวดล้อมที่ค่อนข้างหลากหลายซึ่งฉันอาจใช้ Bash รุ่นต่างๆในโหนด HPC, VM หรือเวิร์กสเตชันส่วนตัวของฉัน เนื่องจากฉันใส่สคริปต์การเข้าสู่ระบบใน repo Git ฉันต้องการใช้ (ish) เดียวกัน.bashrcทั่วกระดานโดยไม่ต้อง "ถ้าโฮสต์นี้แล้ว ... " - ประเภทความยุ่งเหยิง ผมชอบการทำงานเริ่มต้นของการทุบตี≤ 4.1 ที่ขยายcd $SOMEPATHเข้าไปในcd /the/actual/pathเมื่อกดTabคีย์ ในทุบตี 4.2 และสูงกว่าที่คุณจะต้องshopt -s direxpandเปิดใช้งานลักษณะการทำงานนี้และที่ไม่ได้เป็นใช้ได้จนกว่า 4.2.29 นี่เป็นเพียงตัวอย่างเดียว shoptตัวเลือกอื่นที่เกี่ยวข้องอาจเป็นไปได้complete_fullquote(แม้ว่าฉันไม่ทราบว่าสิ่งที่มันทำ) อาจมีการเปลี่ยนแปลงพฤติกรรมเริ่มต้นที่ v4.2 แต่direxpandไม่ได้รับการยอมรับจากรุ่นก่อนหน้าทุบตีและถ้าผมพยายามที่จะshopt -s direxpandอยู่ในของฉัน.bashrcที่ส่งผลให้เกิดข้อผิดพลาดถูกพิมพ์ไปยังคอนโซลครั้งที่ผมเข้าสู่โหนดกับเก่าทุบตีทุก: -bash: shopt: direxpand: invalid shell option name สิ่งที่ฉันต้องการจะทำคือล้อมรอบเงื่อนไขshop -s direxpandเพื่อเปิดใช้งานตัวเลือกนั้นใน Bash> 4.1 อย่างแข็งแกร่งโดยไม่ต้อง chashing เวอร์ชันเก่าของ …

1
diff แสดงความแตกต่างภายในบรรทัดเท่านั้น
ฉันต้องการเปรียบเทียบบรรทัดในสองไฟล์ แต่เพื่อลดจุดรบกวนในเอาต์พุตฉันต้องการเฉพาะความแตกต่างที่แท้จริงในบรรทัดที่จะพิมพ์ ตัวอย่างเช่นกำหนดสองไฟล์ด้านล่าง: a.txt a b c d e f g h i j k l m n o p q r s t u v w x y z b.txt a B c d e f g h i j k l m n o p q r s …

3
“ แปรปรวน” เครื่องหมายและ (พื้นหลังกระบวนการ)
ฉันต้องการทราบว่ามีวิธีที่จะใส่เครื่องหมายและในตัวแปรและยังใช้เพื่อส่งกระบวนการไปยังพื้นหลัง งานนี้: BCKGRND=yes if [ "$BCKGRND" = "yes" ]; then sleep 5 & else sleep 5 fi แต่มันจะไม่เจ๋งมั้ยที่จะบรรลุห้าสายเหล่านั้นด้วยเพียงอันเดียว? ชอบมาก BCKGRND='&' sleep 5 ${BCKGRND} แต่นั่นไม่ได้ผล หาก BCKGRND ไม่ได้ตั้งค่าให้ใช้งานได้ แต่เมื่อตั้งค่ามันจะตีความว่าเป็นตัวอักษร '&' และข้อผิดพลาด

2
สร้างคำสั่งแบบไดนามิก
ฉันกำลังทำงานกับสคริปต์และฉันต้องสร้างtarคำสั่งแบบไดนามิก ต่อไปนี้เป็นสองตัวอย่างเพื่ออธิบายสิ่งที่ฉันพยายามทำ: #!/bin/bash TAR_ME="/tmp" EXCLUDE=("/tmp/hello hello" "/tmp/systemd*" "/tmp/Temp*") _tar="tar "`printf -- '--exclude="%s" ' "${EXCLUDE[@]}"`" -zcf tmp.tar.gz" echo COMMAND: "${_tar}" ${_tar} "$TAR_ME" echo -e "\n\nNEXT:\n\n" EXCLUDE=("--exclude=/tmp/hello\ hello" "--exclude=/tmp/systemd*" "--exclude=/tmp/Temp*") _tar="tar "`printf -- '%s ' "${EXCLUDE[@]}"`" -zcf test.tar.gz" echo COMMAND: "${_tar}" ${_tar} "$TAR_ME" ฉันต้องการที่จะใช้_tarเป็นคำสั่งฉันสามารถทำให้มันทำงานกับเส้นทางแบบคลาสสิก แต่ฉันต้องการมันเพื่อทำงานกับช่องว่างในชื่อโฟลเดอร์ และทุกครั้งที่ฉันพบข้อผิดพลาดที่มีลักษณะ: COMMAND: tar --exclude="/tmp/hello hello" --exclude="/tmp/systemd*" --exclude="/tmp/Temp*" …

6
เรียงลำดับทุบตีตามความยาวขององค์ประกอบ?
รับอาร์เรย์ของสตริงฉันต้องการเรียงลำดับตามความยาวของแต่ละองค์ประกอบ ตัวอย่างเช่น... array=( "tiny string" "the longest string in the list" "middle string" "medium string" "also a medium string" "short string" ) ควรจัดเรียง ... "the longest string in the list" "also a medium string" "medium string" "middle string" "short string" "tiny string" (เป็นโบนัสมันจะดีถ้ารายการเรียงสตริงที่มีความยาวเท่ากันตามลำดับตัวอักษรในตัวอย่างข้างต้นmedium stringถูกเรียงลำดับก่อนmiddle stringแม้ว่าจะมีความยาวเท่ากัน แต่นั่นไม่ใช่ข้อกำหนด "ยาก" หากซับซ้อนกว่า สารละลาย). มันก็โอเคถ้ามีการจัดเรียงอาร์เรย์ในสถานที่ …


2
การปรับเปลี่ยนบรรทัดคำสั่ง XML (สคริปต์เชลล์)
วิธีจัดการ XML จากบรรทัดคำสั่งในเชลล์สคริปต์ มีคำสั่งมากมายสำหรับการจัดการข้อมูลแบบตาราง, ตัวแปรสภาพแวดล้อมการแทนที่หรือแทนที่ส่วนข้อความด้วย regex แต่ฉันไม่พบอะไรเลยสำหรับ XML บิลด์สคริปต์ของฉันจำเป็นต้องแทรกแท็กที่มีเนื้อหาภายในแท็กหลักของเอกสาร xml และฉันพบว่ามันเป็น overkill ในการติดตั้ง java, perl หรือ python ในระบบปฏิบัติการสำหรับจุดประสงค์นั้น (สคริปต์ของฉันทำใน gitlab ด้วยอิมเมจ docker งานของฉันด้วยเครื่องมือที่มีใน maven: ภาพ 3.5-jdk-8 จะเป็นความฝัน) ฉันไม่ต้องการที่จะจัดการกับ XML ที่มี sed แม้ว่าในการสร้างสคริปต์ของฉันมันจะทำงานเพราะมันเป็นความชั่วร้าย ตัวอย่าง: ฉันมี xml ต่อไปนี้: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!-- a lot of other …

3
การป้องกันคำสั่งเชลล์ด้วยตัวแปรสตริง
ภายในภาษาการเขียนโปรแกรมฉันรันคำสั่งเชลล์แบบง่าย ๆ cd var; echo > create_a_file_here ด้วยvarเป็นตัวแปรที่มีสตริง (หวังว่า) ไดเร็กทอรีไปยังตำแหน่งที่ฉันต้องการสร้างไฟล์ "create_a_file_here" ตอนนี้ถ้ามีคนเห็นบรรทัดของรหัสนี้มันเป็นไปได้ที่จะใช้ประโยชน์จากมันโดยการกำหนดเช่น: var = "; rm -rf /" สิ่งต่าง ๆ อาจดูน่าเกลียด วิธีหนึ่งในการหลีกเลี่ยงกรณีข้างต้นอาจเป็นการค้นหาสตริงในvarสำหรับอักขระพิเศษบางตัวเช่น ';' ก่อนดำเนินการคำสั่งเชลล์ แต่ฉันสงสัยว่าสิ่งนี้ครอบคลุมการหาประโยชน์ที่อาจเกิดขึ้นทั้งหมด ไม่มีใครรู้วิธีที่ดีในการตรวจสอบว่า "cd var" เปลี่ยนเฉพาะไดเรกทอรีและไม่มีอะไรอีกหรือไม่

7
ตรงข้ามกับคำสั่ง `source '
ฉันใช้sourceคำสั่งในสคริปต์ทุบตีของฉันเพื่ออ่าน / พิมพ์ค่าตัวแปร more linuxmachines_mount_point.txt export linuxmachine01="sdb sdc sdf sdd sde sdg" export linuxmachine02="sde sdd sdb sdf sdc" export linuxmachine03="sdb sdd sdc sde sdf" export linuxmachine06="sdb sde sdf sdd" source linuxmachines_mount_point.txt echo $linuxmachine01 sdb sdc sdf sdd sde sdg อะไรคือสิ่งที่ตรงกันข้ามsourceเพื่อยกเลิกการตั้งค่าตัวแปร? ผลลัพธ์ที่คาดหวัง echo $linuxmachine01 < no output >

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