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

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

2
เชลล์สคริปต์ส่งข้อผิดพลาดที่ไม่พบเมื่อเรียกใช้จากไฟล์ sh แต่ถ้าป้อนด้วยตนเองคำสั่งจะทำงาน
ฉันพยายามใช้สคริปต์ต่อไปนี้เพื่อสร้างแผนผังเว็บไซต์สำหรับเว็บไซต์ของฉัน เมื่อฉันเรียกใช้เมื่อsh thsitemap.shฉันได้รับข้อผิดพลาดเช่นนี้และสร้างไฟล์ sitemap.xml ที่ว่างเปล่า: thsitemap.sh: 22: thsitemap.sh: [[: not found thsitemap.sh: 42: thsitemap.sh: [[: not found thsitemap.sh: 50: thsitemap.sh: Syntax error: "(" unexpected แต่ในฐานะผู้ใช้คนเดียวกันrootเมื่อฉันคัดลอกและวางบรรทัดเหล่านี้บนเทอร์มินัลด้วยตนเองมันทำงานได้โดยไม่มีข้อผิดพลาดใด ๆ และไฟล์ sitemap.xml มี URL ทั้งหมด มีปัญหาอะไร? ฉันจะแก้ไขสิ่งนี้ได้อย่างไร #!/bin/bash ############################################## # modified version of original http://media-glass.es/ghost-sitemaps/ # for ghost.centminmod.com # http://ghost.centminmod.com/ghost-sitemap-generator/ ############################################## url="techhamlet.com" webroot='/home/leafh8kfns/techhamlet.com' path="${webroot}/sitemap.xml" …

6
วิธีตรวจสอบว่าระบบไฟล์ติดตั้งด้วยสคริปต์หรือไม่
ฉันใหม่ในการเขียนสคริปต์ ... ฉันสามารถทำสิ่งพื้นฐานมาก แต่ตอนนี้ฉันต้องการมือ ฉันมีระบบไฟล์ในตัวเครื่องซึ่งจะติดตั้งเมื่อฉันต้องสำรองข้อมูลเท่านั้น ฉันเริ่มต้นด้วยสิ่งนี้ #!/bin/bash export MOUNT=/myfilesystem if grep -qs $MOUNT /proc/mounts; then echo "It's mounted." else echo "It's not mounted."; then mount $MOUNT; fi อย่างที่ฉันพูดฉันว่าพื้นฐานในการเขียนสคริปต์ ฉันได้ยินมาว่าคุณสามารถตรวจสอบสถานะของmountคำสั่งได้โดยดูที่รหัสส่งคืน RETURN CODES mount has the following return codes (the bits can be ORed): 0 success 1 incorrect invocation or permissions 2 …

3
ฉันจะสร้างไฟล์เปล่าใหม่ในสคริปต์ทุบตีได้อย่างไร
ฉันกำลังเรียกใช้สคริปต์ Perl ของบุคคลที่สามซึ่งเขียนว่ามันต้องการไฟล์เอาต์พุตสำหรับแฟล็กเอาท์พุท, -o. น่าเสียดายที่สคริปต์ดูเหมือนต้องการไฟล์จริงนั่นคือผู้ใช้ต้องสร้างไฟล์ว่างfilename.txtด้วย 0 ไบต์จากนั้นป้อนไฟล์เปล่านี้ในบรรทัดคำสั่งสคริปต์ perl script1.pl -o filename.txt คำถาม: ฉันจะสร้างไฟล์ว่างในสคริปต์ทุบตีได้อย่างไร หากพยายามเพียงครั้งperl script1.pl -o filename.txtเดียวสคริปต์จะแจ้งข้อผิดพลาดว่าไม่มีไฟล์อยู่

4
วิธีการแตกสตริงที่ยาวเป็นหลายบรรทัดในพร้อมต์ read -p ภายในซอร์สโค้ด?
/bin/shฉันจะเขียนสคริปต์การติดตั้งที่จะใช้เป็น มีบรรทัดแจ้งให้ไฟล์: read -p "goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] " REPLY ฉันต้องการแบ่งบรรทัดยาวเป็นหลายบรรทัดเพื่อไม่ให้มีเกิน 80 อักขระ ฉันกำลังพูดถึงบรรทัดภายในซอร์สโค้ดของสคริปต์ ไม่เกี่ยวกับบรรทัดที่จะพิมพ์จริงบนหน้าจอเมื่อสคริปต์ถูกดำเนินการ! สิ่งที่ฉันได้ลอง: วิธีการเริ่ม: read -p "goat can try change directory if cd fails to do so. " \ "Would you like …

3
การเข้าถึงตัวแปรดัชนีอาร์เรย์จาก bash shell script loop?
ฉันต้องการเข้าถึงตัวแปรดัชนีอาเรย์ขณะวนลูปผ่านอาเรย์ในสคริปต์ bash shell ของฉัน myscript.sh #!/bin/bash AR=('foo' 'bar' 'baz' 'bat') for i in ${AR[*]}; do echo $i done ผลลัพธ์ของสคริปต์ด้านบนคือ: foo bar baz bat ผลลัพธ์ที่ฉันค้นหาคือ: 0 1 2 3 ฉันจะเปลี่ยนสคริปต์เพื่อให้บรรลุสิ่งนี้ได้อย่างไร

5
ฉันจะรับเฉพาะ PID ที่ไม่มีข้อมูลเพิ่มเติมใด ๆ ของกระบวนการที่ทำงานบนพอร์ต 3000 ได้อย่างไร
ฉันใช้ CentOS 7 ฉันต้องการรับ PID (ถ้ามี) ของกระบวนการที่ทำงานบนพอร์ต 3000 ฉันต้องการรับ PID นี้เพื่อวัตถุประสงค์ในการบันทึกเป็นตัวแปรในเชลล์สคริปต์ จนถึงตอนนี้ฉันมี [rails@server proddir]$ sudo ss -lptn 'sport = :3000' State Recv-Q Send-Q Local Address:Port Peer Address:Port Cannot open netlink socket: Protocol not supported LISTEN 0 0 *:3000 *:* users:(("ruby",pid=4861,fd=7),("ruby",pid=4857,fd=7),("ruby",pid=4855,fd=7),("ruby",pid=4851,fd=7),("ruby",pid=4843,fd=7)) แต่ฉันไม่สามารถหาวิธีที่จะแยก PID ทั้งหมดได้ด้วยตัวเองโดยไม่มีข้อมูลเพิ่มเติมทั้งหมดนี้

5
ฉันจะเรียงลำดับรายการด้วยระดับ major.minor.patch และบางครั้ง rc อย่างถูกต้องได้อย่างไร
ฉันต้องเรียงลำดับรายการต่อไปนี้ด้วยเชลล์สคริปต์และทำให้เวอร์ชันล่าสุดปรากฏที่ด้านล่างหรือด้านบน ฉันจะทำอย่างไรกับเครื่องมือของเชลล์เท่านั้น? release-5.0.0.rc1 release-5.0.0.rc2 release-5.0.0 release-5.0.1 release-5.0.10 release-5.0.11 release-5.0.13 release-5.0.14 release-5.0.15 release-5.0.16 release-5.0.17 release-5.0.18 release-5.0.19 release-5.0.2 release-5.0.20 release-5.0.21 release-5.0.22 release-5.0.23 release-5.0.24 release-5.0.25 release-5.0.26 release-5.0.27 release-5.0.28 release-5.0.29 release-5.0.3
18 shell-script  awk  sed  python  sort 

4
วิธีการที่สอดคล้องกับ checkbashisms เพื่อกำหนดเชลล์ปัจจุบัน
ในของ.profileฉันฉันใช้รหัสต่อไปนี้เพื่อให้แน่ใจว่านามแฝงที่เกี่ยวข้องกับ Bash และฟังก์ชั่นมีที่มาเฉพาะถ้าเปลือกเข้าสู่ระบบเป็น Bashจริง: # If the current (login) shell is Bash, then if [ "${BASH_VERSION:-}" ]; then # source ~/.bashrc if it exists. if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi ขณะนี้ฉันกำลังวางไฟล์เชลล์สคริปต์และฟังก์ชั่นการทำงานภายใต้การควบคุมเวอร์ชัน ฉันยังเพิ่งเริ่มต้นขั้นตอนการลบ Bashisms สบายจากสคริปต์เปลือกที่ไม่ได้รับประโยชน์จากคุณลักษณะทุบตีเฉพาะเช่นแทนที่ด้วยfunction funcname()funcname() สำหรับที่เก็บไฟล์เชลล์ของฉันฉันได้กำหนดค่าฮุคล่วงหน้าที่เรียกใช้checkbashismsยูทิลิตี้จากแพ็คเกจ devscriptsของ Debian ในแต่ละshไฟล์ในที่เก็บเพื่อให้แน่ใจว่าฉันไม่ได้แนะนำไวยากรณ์เฉพาะของ Bash โดยไม่ได้ตั้งใจ อย่างไรก็ตามสิ่งนี้ทำให้เกิดข้อผิดพลาดสำหรับ.profile: possible bashism in .profile …

6
ควรอ้างอิงตัวแปรเมื่อดำเนินการหรือไม่
กฎทั่วไปในการเขียนสคริปต์เปลือกคือตัวแปรที่ควรจะยกมาเว้นแต่จะมีเหตุผลที่น่าสนใจที่จะไม่ สำหรับรายละเอียดมากกว่าที่คุณอาจต้องการทราบลองดูที่ Q&A ที่ยอดเยี่ยมนี้: ผลกระทบด้านความปลอดภัยของการลืมอ้างตัวแปรใน bash / POSIX shellsเปลือกหอย พิจารณาอย่างไรก็ตามฟังก์ชั่นเช่นนี้: run_this(){ $@ } ควร$@จะยกมามีหรือไม่? ฉันเล่นกับมันสักครู่และไม่พบกรณีใด ๆ ที่การขาดคำพูดทำให้เกิดปัญหา ในทางกลับกันการใช้เครื่องหมายคำพูดทำให้หยุดพักเมื่อส่งคำสั่งที่มีช่องว่างเป็นตัวแปรที่ยกมา: #!/usr/bin/sh set -x run_this(){ $@ } run_that(){ "$@" } comm="ls -l" run_this "$comm" run_that "$comm" การเรียกใช้สคริปต์ด้านบนส่งคืน: $ a.sh + comm='ls -l' + run_this 'ls -l' + ls -l total 8 -rw-r--r-- 1 …

2
มีบางอย่างเช่น "แยก ()" ของ JavaScript ในเปลือกหรือไม่
มันใช้งานง่ายมากsplit()ใน JavaScript เพื่อแยกสตริงออกเป็นอาร์เรย์ เชลล์สคริปต์เป็นอย่างไร พูดว่าฉันต้องการทำสิ่งนี้: $ script.sh var1_var2_var3 เมื่อผู้ใช้ให้สตริงดังกล่าวvar1_var2_var3กับ script.sh ภายในสคริปต์มันจะแปลงสตริงเป็นอาร์เรย์เช่น array=( var1 var2 var3 ) for name in ${array[@]}; do # some code done

2
สิ่งนี้ '&' ในตอนท้ายของคำสั่งของฉันทำให้สคริปต์เร็วขึ้น?
ในขณะที่การแก้ปัญหา CTF ออนไลน์ฉันเจอสถานการณ์ที่ฉันต้องการทำให้เซิร์ฟเวอร์ยุ่งเหยิง นี่คือรหัสที่ฉันเขียน: #!/bin/bash for i in {0..9}{0..9}{0..9}{0..9} do echo "Now trying code.." echo $i echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt done นี้เป็นอย่างเหลือเชื่อช้าเจ็บปวด ฉันต้องลองชุดค่าผสมจาก 1,000 ถึง 9999 และใช้เวลาประมาณ 5 วินาทีต่อการพยายาม 10 ครั้ง จากนั้นทำตามคำแนะนำฉันใส่ '&' ที่ท้ายบรรทัดนี้: echo "a fixed string" $i | nc localhost …

1
วิธีดำเนินการต่อสคริปต์หลังจากรีบูตเครื่อง?
ฉันกำลังเขียนเชลล์สคริปต์ในทุบตี ในบางช่วงของสคริปต์จะตรวจพบว่าเครื่องจำเป็นต้องรีบูตก่อนดำเนินการต่อ มันเป็นปัญหา: sudo reboot เมื่อเครื่องกลับมาทำงานจะมีงานอีกมากที่สคริปต์นี้ต้องทำ ฉันจะกำหนดค่าบางสิ่งเพื่อทำงานในสคริปต์นี้ต่อไปได้อย่างไร ฉันสมมติว่ามีบางที่ที่ฉันสามารถเขียนเชลล์สคริปเพื่อที่มันจะถูกประหารชีวิตในการรีบูทครั้งต่อไป สถานที่ดังกล่าวอยู่ที่ไหน ฉันเห็นว่า cron มีคำสั่ง @reboot ฉันรู้ด้วยเช่นกันว่าบริการต่างๆของ Apache เริ่มขึ้นจากการบูทโดยคนธรรมดา สิ่งเหล่านี้จะเป็นกลไกที่เหมาะสมหรือไม่? ถ้าเป็นเช่นนั้นจะทริกเกอร์อย่างไร? สคริปต์นี้ต้องทำงานครั้งเดียวไม่ใช่ทุกครั้งที่รีบูต ดังนั้นจะต้องไปที่ไหนสักแห่งที่เพิ่งทำงานในการรีบูตครั้งถัดไปหรือสามารถลบตัวเองได้เมื่อมันทำงาน คำถามนี้ถามเกี่ยวกับวิธีบันทึกสถานะแอปพลิเคชันของคุณหลังจากรีบูต สคริปต์ของฉันไม่มีสถานะมากนักดังนั้นฉันจึงสามารถจัดการได้ ฉันแค่ต้องรู้วิธีที่จะให้สคริปต์นี้กระตุ้นให้บางสิ่งบางอย่างทำงานหลังจากรีบูตครั้งถัดไป รุ่นเฉพาะของฉันคือ Ubuntu Linux 14.04 สคริปต์ดั้งเดิมเริ่มต้นบนบรรทัดคำสั่งโดยผู้ดูแลระบบ (ต่างจากการเรียกใช้จาก cron)


2
วิธีการเขียนฟังก์ชั่นทุบตีโดยใช้ท่อ?
ฉันมีฟังก์ชั่นบางอย่างที่กำหนดไว้ในแบบนี้: function f { read and process $1 ... echo $result } ฉันต้องการที่จะประกอบมันเข้าด้วยกันเพื่อที่การภาวนาจะเป็นเช่นf | g | hนั้น ฉันใช้สำนวนอะไรในการแปลงฟังก์ชั่นที่ทำงานกับข้อโต้แย้งเป็นหนึ่งข้อโต้แย้งการอ่านจาก stdin? เป็นไปได้ไหมที่จะอ่านคู่ tuples ของการขัดแย้งจากกระแสโดยไม่จำเป็นต้องหลบหนีพวกมัน (เช่นการยกเลิก null)?

2
การขยายตัวของตัวแปรหอยและผลกระทบของ glob และแยกกับมัน
จริงๆแล้วโพสต์นี้มีคำถามสองข้อแยกกัน แต่ฉันคิดว่าการรวมกลุ่มพวกเขาเข้าด้วยกันจะให้บริบทเพิ่มเติม ฉันผ่านคำถามนี้ไปแล้วเกี่ยวกับเครื่องหมายคำพูดเกี่ยวกับตัวแปรแต่ฉันไม่เข้าใจว่าการขยายตัวของตัวแปรหมายถึงอะไรในตอนแรก ดังนั้นคำถามแรกของฉันคือ: อะไรคือการขยายตัวของตัวแปรใน Unix / Linux พูด? ส่วนที่สองของคำถามของฉันเกี่ยวข้องกับข้อกำหนดต่อไปนี้: glob แยก ค่าข้างต้นหมายถึงอะไรและมีผลต่อการขยายตัวของตัวแปรอย่างไร คำตอบสำหรับคำถามเดิมกล่าวถึงต่อไปนี้: คิดว่าไม่มีเครื่องหมายคำพูด (ในบริบทรายการ) เป็นตัวดำเนินการแยก + glob ราวกับว่า echo $ test เป็น echo glob (แยก ("$ test")) ฉันไม่สามารถหาคำตอบใด ๆ ที่อยู่ตรงแนวคิดของglobbingและแยกแต่ใช้คำเหล่านั้นได้โดยตรงในการตอบคำถามอื่น ๆ เช่นนี้หนึ่งเมื่อเร็ว ๆ นี้

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