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

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

2
นับจำนวนองค์ประกอบในอาร์เรย์ทุบตีที่ชื่อของอาร์เรย์เป็นแบบไดนามิก (เช่นเก็บไว้ในตัวแปร)
คำชี้แจงสั้น ๆ ของคำถาม: มีวิธีการทุบตีในตัวเพื่อนับจำนวนขององค์ประกอบในอาร์เรย์ทุบตีที่ชื่อของอาร์เรย์เป็นแบบไดนามิก (เช่นเก็บไว้ในตัวแปร) โดยไม่ต้องหันไปทำสำเนาอย่างเต็มที่ของอาร์เรย์หรือใช้eval? ข้อมูลมากกว่านี้: การใช้การแทนที่พารามิเตอร์ bash สามารถทำได้ดังนี้: myArr=(A B C); echo ${#myArr[@]}กำหนดความยาวของอาร์เรย์: การอ้างอิงตัวแปรทางอ้อมโดยใช้ชื่อ: NAME=myVar; echo ${!NAME}(สิ่งนี้ยังใช้กับองค์ประกอบอาร์เรย์): NAME=myArr[1]; echo ${!NAME} แต่ถ้าชื่อของอาเรย์ถูกเก็บไว้ในตัวแปรอีกตัวหนึ่งจะกำหนดจำนวนขององค์ประกอบในอาเรย์ได้อย่างไร? (หนึ่งอาจพิจารณาว่าเป็นการรวมกันของการแทนที่พารามิเตอร์สองตัวด้านบน) ตัวอย่างเช่น: myArr=(A B C D) NAME=myArr # Get the number of elements in the array indirectly referenced by NAME. count=${#$NAME[@]} # This syntax is invalid. What …

4
ทดสอบว่าพอร์ตเทลเน็ตแอ็คทีฟภายในเชลล์สคริปต์หรือไม่
ฉันกำลังพยายามสร้างสคริปต์เพื่อทดสอบว่าสามารถเข้าสู่ระบบผ่าน telnet ได้หรือไม่ ฉันไม่ต้องการที่จะเข้าสู่ระบบจริงๆ; ดังนั้นจึงไม่จำเป็นต้องคาดหวัง ฉันแค่ต้องการดูว่าฉันสามารถรับพร้อมท์การเข้าสู่ระบบได้หรือไม่ สิ่งนี้ทำจากระบบ Linux ดังนั้นฉันพยายามใช้nc: nc 192.168.10.5 23 -w 1 | grep -q login if [ $? -eq 1 ] then echo "console is down" fi ปัญหาคือสิ่งนี้ทำให้คอนโซลของฉันล็อค ดูเหมือนว่า-wจะไม่ได้ลดลงการเชื่อมต่อ ฉันพยายามใช้ telnet ด้วย แต่ฉันไม่สามารถหยุดการเชื่อมต่อจากภายในสคริปต์ได้ พยายาม \echo "\035" | telnet 192.168.10.5 หยุดพักก่อนที่ฉันจะได้รับพรอมต์การเข้าสู่ระบบ

4
ฉันจะ cat เนื้อหาของไฟล์ที่พบโดยใช้ find เป็นไฟล์เดียวได้อย่างไร?
ฉันพยายามที่จะยิงตัวเองในที่ที่เจ็บ (แย่มาก) โดยการฟอร์แมตพาร์ติชันที่เก็บข้อมูลที่มีค่า แน่นอนมันไม่ได้ตั้งใจ แต่มันเกิดขึ้น อย่างไรก็ตามฉันจัดการเพื่อใช้testdiskและphotorecกู้คืนข้อมูลส่วนใหญ่ ตอนนี้ฉันมีข้อมูลทั้งหมดที่แจกจ่ายไปแล้วกว่า 25,000 ไดเรกทอรี ไฟล์ส่วนใหญ่เป็นไฟล์. txt ส่วนที่เหลือเป็นไฟล์รูปภาพ มีไฟล์. txt มากกว่า 300 ไฟล์ในแต่ละไดเรกทอรี ฉันสามารถgrepหรือใช้findเพื่อแยกสตริงจากไฟล์. txt และส่งออกไปยังไฟล์ ตัวอย่างเช่นต่อไปนี้เป็นบรรทัดที่ฉันใช้ตรวจสอบว่าข้อมูลของฉันอยู่ในไฟล์ที่กู้คืนแล้ว: find ./recup*/ -name '*.txt' -print | xargs grep -i "searchPattern" ฉันสามารถเอาท์พุท "searchPattern" ไปยังไฟล์ได้ แต่นั่นให้รูปแบบนั้น นี่คือสิ่งที่ฉันต้องการจะทำจริง: ผ่านไฟล์ทั้งหมดและค้นหาสตริงเฉพาะ หากพบสตริงนั้นในไฟล์ให้จับเนื้อหาทั้งหมดของไฟล์นั้นไปยังไฟล์เอาต์พุต หากพบรูปแบบในไฟล์มากกว่าหนึ่งไฟล์ต่อท้ายเนื้อหาของไฟล์ที่ตามมาไปยังไฟล์เอาต์พุตนั้น โปรดทราบว่าฉันไม่ต้องการส่งออกรูปแบบที่ฉันค้นหา แต่เนื้อหาทั้งหมดของไฟล์ที่พบรูปแบบ ฉันคิดว่ามันเป็นไปได้ แต่ฉันไม่รู้วิธีที่จะคว้าเนื้อหาทั้งหมดของไฟล์หลังจาก grepping รูปแบบเฉพาะจากมัน

4
Bash จะให้กระบวนการพื้นหลังทำงานอย่างไร แต่รอให้กระบวนการอื่น ๆ ทำงาน
ฉันมี (ยัง) อีกwait, &, &&คำถามการควบคุมการไหล .. ว่าฉันมีสคริปต์บางอย่างเช่นนี้ที่ฉันต้องการทำงานมากที่สุดในเวลาเดียวกันเป็นไปได้: # may take some hours something InputA > IrrelevantA & something InputB > IrrelevantB & # may take an hour ( somethingElse InputA > OutputA & somethingElse InputB > OutputB & )&& combine OutputA OutputB > Result ...morestuff คำถามที่ 1: ในสคริปต์combineรอให้somethingElseกระบวนการทั้งสองเสร็จสิ้นในขณะที่somethingกระบวนการทั้งสองดำเนินการต่อหรือไม่ คำถามที่ 2: …

7
$ 0 จะรวมเส้นทางไปยังสคริปต์หรือไม่
ฉันต้องการ grep สคริปต์ปัจจุบันเพื่อให้ฉันสามารถพิมพ์ความช่วยเหลือและข้อมูลรุ่นจากส่วนความเห็นที่ด้านบน ฉันกำลังคิดถึงสิ่งนี้: grep '^#h ' -- "$0" | sed -e 's/#h //' แต่ฉันสงสัยว่าจะเกิดอะไรขึ้นถ้าสคริปต์นั้นอยู่ในไดเรกทอรีที่อยู่ใน PATH และถูกเรียกโดยไม่ระบุไดเรกทอรีอย่างชัดเจน ฉันค้นหาคำอธิบายของตัวแปรพิเศษและพบคำอธิบายต่อไปนี้ของ$0: ชื่อของเชลล์หรือโปรแกรมปัจจุบัน ชื่อไฟล์ของสคริปต์ปัจจุบัน ชื่อของสคริปต์เอง คำสั่งในขณะที่มันถูกเรียกใช้ สิ่งเหล่านี้ไม่ทำให้ชัดเจนว่าค่าของ$0จะรวมถึงไดเรกทอรีหรือไม่หากสคริปต์ถูกเรียกใช้โดยไม่มี อันสุดท้ายบ่งบอกถึงความจริงที่ว่ามันจะไม่เกิดขึ้น ทดสอบบนระบบของฉัน (Bash 4.1) ฉันสร้างไฟล์เรียกทำงานได้ใน / usr / local / bin ชื่อscriptnameด้วยหนึ่งบรรทัดecho $0และเรียกใช้จากตำแหน่งอื่น นี่คือผลลัพธ์ของฉัน: > cd /usr/local/bin/test > ../scriptname ../scriptname > cd /usr/local/bin > ./scriptname ./scriptname > …

1
การขยายตัวแปรทางอ้อมใน POSIX เช่นเดียวกับในทุบตี?
เป็นไปได้หรือมีแฮ็กที่สง่างามที่จะทำการขยายตัวแปรทางอ้อมใน POSIX ที่สามารถทำได้ใน Bash? สำหรับบริบทฉันพยายามทำสิ่งต่อไปนี้: for key in ${!map_*} do # do something done แก้ไข: map_ชี้แจงฉันต้องการที่จะเข้าถึงเปลือกตัวแปรที่ขึ้นต้นด้วย

4
อาร์เรย์ที่เกี่ยวข้องในเชลล์สคริปต์
ฉันเห็นเคล็ดลับสำหรับการใช้อาร์เรย์เชื่อมโยงในเชลล์สคริปต์ ตัวอย่างเช่นprint array["apples"]สามารถสคริปต์เป็นecho \$array$keyตำแหน่งที่สำคัญ = แอปเปิ้ล อย่างไรก็ตามไม่มีการพูดถึงวิธีสร้างคีย์เพื่อวนซ้ำแถวลำดับ วิธีเดียวที่ฉันคิดได้ก็คือเก็บคีย์ไว้ในตัวแปรที่คั่นด้วยช่องว่างดังนั้นฉันสามารถใช้ for-loop เพื่อวนซ้ำในอาร์เรย์ ดังนั้นมีวิธีอื่นในการจัดเก็บคีย์เพื่อใช้ในภายหลังหรือไม่

3
การมอบหมายแบบมีเงื่อนไขขึ้นอยู่กับตัวแปรสภาพแวดล้อม
ในสคริปต์ทุบตีฉันกำลังกำหนดตัวแปรโลคัลเพื่อให้ค่าขึ้นอยู่กับตัวแปรสภาพแวดล้อมโกลบอล ( $MYAPP_ENV) if [ "$MYAPP_ENV" == "PROD" ] then SERVER_LOGIN=foobar123@prod.example.com else SERVER_LOGIN=foobar987@test.example.com fi มีวิธีที่สั้นกว่า (ยังสะอาด) ในการเขียนการบ้านข้างต้นหรือไม่? (สมมุติว่าใช้ตัวดำเนินการตามเงื่อนไข / แบบอินไลน์บางอย่างถ้า)

5
เชลล์สคริปต์เพื่อส่งเมลแจ้งเตือนหากการใช้งานดิสก์เกิน 90%
ฉันต้องการติดตั้งสคริปต์บนเซิร์ฟเวอร์ของฉันซึ่งจะส่งการแจ้งเตือนทางอีเมลโดยอัตโนมัติหากการใช้งานดิสก์เกิน 90% และการแจ้งเตือนทางอีเมลครั้งที่สองเมื่อเกินกว่า 95% ระบบแฟ้มของฉันคือและติดประเด็นก็คือabc:/xyz/abc/pqr ฉันได้ลองสิ่งนี้แล้ว: ADMIN="someone@def.com" ALERT=90 df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom' | awk '{ print $5 " " $1 }' | while read output; do usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) partition=$(echo $output | awk '{ print $2 …


4
Bash script เพื่อตรวจหาระบบควบคุมเวอร์ชันโดยการทดสอบสถานะการส่งคืนคำสั่ง
ฉันกำลังทำงานกับสคริปต์ทุบตีที่ฉันต้องการทำงานกับ VCS หลายประเภท ฉันคิดว่าการทดสอบว่าไดเรกทอรีเป็น repo สำหรับระบบโดยใช้คำสั่งข้อมูลทั่วไปและตรวจสอบรหัสส่งคืนสำเร็จหรือข้อผิดพลาด ในรหัสหลอก: if a svn command succeded; Then run svn commands elif a darcs command succeded; Then run darcs commands elif a mercurial command succeded; then run hg commands else something else fi ฉันสามารถเรียกใช้คำสั่งเช่น darcs show repoและใช้$?เพื่อรับรหัสส่งคืน คำถามของฉันคือมีวิธีเรียกใช้และส่งคืนหมายเลขรหัสส่งคืนในบรรทัดเดียวหรือไม่ ตัวอย่างเช่น if [ 0 -eq `darcs show …

2
ทำไม #! / usr / bin / env ทุบตีไม่ทำงานในระบบของฉัน
bad interpreterฉันวิ่งเข้าไปในบางประเด็นที่เมื่อทำงานสคริปต์การติดตั้งบางอย่างที่พวกเขาบ่น ดังนั้นฉันจึงทำตัวอย่างเล็กน้อย แต่ไม่สามารถเข้าใจได้ว่าปัญหาคืออะไรดูด้านล่าง #!/usr/bin/env bash echo "hello" การเรียกใช้สคริปต์ข้างต้นส่งผลให้เกิดข้อผิดพลาดดังต่อไปนี้ [root@ech-10-24-130-154 dc-user]# ./junk.sh bash: ./junk.sh: /usr/bin/env: bad interpreter: No such file or directory /usr/bin/envไฟล์ที่มีอยู่ดูด้านล่าง: [root@ech-10-24-130-154 dc-user]# ls -l /usr/bin/env lrwxrwxrwx 1 root root 13 Jan 27 04:14 /usr/bin/env -> ../../bin/env [root@ech-10-24-130-154 dc-user]# ls -l /bin/env -rwxr-xr-x 1 root root 23832 Jul …

3
เรียกสคริปต์สำหรับสคริปต์อื่น แต่อย่าออกจากพาเรนต์ถ้าลูกเรียกออก
first.sh: #! /bin/ksh echo "prova" . ./second.sh echo "ho lanciato il secondo" . ./third.sh echo "ho lanciato il terzo" second.sh: echo "sono nel secondo script" dosomething1 exit $? หากsecond.shตรวจพบข้อผิดพลาดและออกด้วยสถานะ -9 ให้first.shออกเสมอ ฉันจะหลีกเลี่ยงการออกจากเปลือกแรกได้อย่างไรถ้าเปลือกลูกออก? second.shฉันไม่สามารถแก้ไข

3
กดปุ่มใดก็ได้เพื่อหยุดเชลล์สคริปต์ชั่วคราวกดอีกครั้งเพื่อดำเนินการต่อ
ฉันเขียนเชลล์สคริปต์เพื่อทดสอบ API ที่คัดลอกไฟล์และสะท้อนความคืบหน้าหลังจากแต่ละไฟล์ มีการนอนหลับสองวินาทีระหว่างแต่ละสำเนาดังนั้นฉันต้องการเพิ่มความสามารถในการกดปุ่มใด ๆ เพื่อหยุดสคริปต์ชั่วคราวเพื่อให้ทดสอบได้ลึกขึ้น จากนั้นกดปุ่มใดก็ได้เพื่อกลับมาทำงานต่อ ฉันจะเพิ่มสิ่งนี้ลงในสองสามบรรทัดได้อย่างไร

3
วิธีการเขียนสคริปต์ทุบตีที่เข้าสู่เครื่องอื่นเพื่อทำสิ่ง?
เป็นไปได้ไหมที่จะเขียนสคริปต์ทุบตี จะเริ่มจากเครื่อง A, เข้าสู่ระบบในเครื่อง B อื่นโดย ssh (ทั้งเครื่อง A และ B จะเป็น Linux-Machines), คัดลอกไฟล์บางไฟล์ไปยังเครื่อง B รันสคริปต์ python กับสคริปต์ python ที่ระบุบนเครื่องเหล่านี้ โอนผลลัพธ์กลับไปที่เครื่อง A ออกจากระบบบี เทคนิคนี้ใช้ได้หรือไม่?
11 bash  ssh  shell-script 

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