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

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

4
วิธีหยุดสคริปต์ไม่ให้ทำงานหากไม่ใช่รูท (และ echo“ ไม่ทำงานเหมือนรูท! กำลังออกจาก…”)
นี่คือที่มาของฉัน: #!/bin/bash echo "Running script to free general cached memory!" echo ""; echo "Script must be run as root!"; echo ""; echo "Clearing swap!"; swapoff -a && swapon -a; echo ""; echo "Clear inodes and page file!"; echo 1 > /proc/sys/vm/drop_caches; echo ""; มันล้างแคชและสิ่งต่าง ๆ และมันก็สะท้อนให้เห็นว่ามันจะต้องทำงานเหมือนรูทในเครื่อง ฉันเพียงต้องการให้สคริปต์หยุดทำงานหากตรวจพบว่าไม่ได้ถูกเรียกใช้งานในฐานะรูท ตัวอย่าง: "Running script …

3
มีวิธีแปลง zip เป็น tar โดยไม่ต้องแตกไฟล์ไปยังระบบไฟล์หรือไม่?
มีวิธีแปลงzipไฟล์เก็บถาวรเป็นtarไฟล์เก็บถาวรโดยไม่แยกไปที่ไดเรกทอรีชั่วคราวก่อนหรือไม่? (และโดยไม่ต้องเขียนการใช้งานของฉันเองtarหรือunzip)
17 shell-script  tar  zip 

2
วิธีรับชื่อของผู้ใช้ที่รันสคริปต์ bash เป็น sudo
ฉันต้องการสร้างสคริปต์ทุบตีที่ต้องดำเนินการด้วย sudo แต่ควรคำนึงถึงชื่อของผู้ใช้ที่ไม่ใช่ sudo ที่ดำเนินการ ดังนั้นหากผู้ใช้bobรันsudo ./myscript.shฉันอยากmyscript.shรู้bobเป็นผู้ดำเนินการ ลองดูข้างในmyscript.sh: USER=$(whoami) # Do something that takes into account the username. ฉันจะทราบชื่อของผู้ใช้ที่วางกระบวนการได้อย่างไร โดยเฉพาะอย่างยิ่งสิ่งที่ฉันควรใช้แทนที่จะwhoamiได้รับbobและไม่root?

4
แจ้งให้ผู้ใช้ล็อกอินเป็นรูทเมื่อรันเชลล์สคริปต์
ปัญหาที่ฉันได้รับคือเมื่อฉันป้อนคำสั่ง su - root ที่จุดเริ่มต้นของไฟล์เชลล์สคริปต์ของฉันจะแจ้งให้ผู้ใช้ป้อนรหัสผ่านและจากนั้นจะไม่ดำเนินการกับสคริปต์เชลล์ส่วนที่เหลือต่อไป ฉันต้องค้นหาด้วยตนเองและเรียกใช้เชลล์สคริปต์ผ่านเทอร์มินัล ฉันต้องการสคริปต์เพื่อให้แน่ใจว่าผู้ใช้เข้าสู่ระบบในฐานะ root แล้วดำเนินการต่อกับส่วนที่เหลือของสคริปต์เชลล์ กล่าวอีกนัยหนึ่งฉันต้องการเรียกใช้สคริปต์ในฐานะผู้ใช้ใด ๆ แต่ทันทีที่สคริปต์เริ่มดำเนินการผู้ใช้จะต้องเปลี่ยนเป็นรูทแล้วดำเนินการต่อโดยใช้สคริปต์ที่เหลือเป็นรูทจนกว่าจะเสร็จ สามารถทำได้หรือไม่

3
การเพิ่มคอลัมน์ของค่าในไฟล์ที่คั่นด้วยแท็บ
ฉันจะเพิ่มคอลัมน์ของค่าในไฟล์ที่มีจำนวนแถวที่แน่นอนได้อย่างไร ฉันมีไฟล์อินพุตดังนี้: ไฟล์อินพุต: SPATA17 1 217947738 LYPLAL1 1 219383905 FAM47E 4 77192838 SHROOM3 4 77660162 SHROOM3 4 77660731 SHROOM3 4 77662248 ไฟล์ที่ส่งออก: SPATA17 1 217947738 file1 LYPLAL1 1 219383905 file1 FAM47E 4 77192838 file1 SHROOM3 4 77660162 file1 SHROOM3 4 77660731 file1 SHROOM3 4 77662248 file1 ในกรณีนี้ฉันต้องการเพิ่มคอลัมน์ของค่าจนถึงจำนวนแถวในไฟล์ค่ายังคงสอดคล้องเช่น "file1" เหตุผลคือฉันมี 100 …

2
แยกสตริงตามรูปแบบในสคริปต์ทุบตี
ในทุบตีสมมติว่าฉันมีสตริงstrname: strname="ph7go04325r" ฉันต้องการที่จะดึงตัวละครระหว่างครั้งแรก "3"ของตัวละครและสุดท้าย "r"ตัวละครในการประหยัดผลในสตริงstrname strresultในตัวอย่างข้างต้นผลลัพธ์strresultจะเป็น: strresult="25" "3"อักขระตัวแรกไม่จำเป็นต้องอยู่ที่ตำแหน่งสตริง 8 ในstrname; เช่นเดียวกันที่ผ่านมา"r"คือไม่จำเป็นต้องที่ตำแหน่งสตริง 11. ดังนั้นทั้งสองสายดังต่อไปนี้strnameควรผลผลิตstrresult="25": strname="ph11go04325raa" strname="325r" strname="rgo04325raa" นอกจากนี้ควรผลผลิตstrname=ph12go04330raa"strresult="30" ฉันยังใหม่กับการเขียนสคริปต์ทุบตีและฉันไม่รู้ว่าจะเริ่มจับคู่รูปแบบสตริงได้อย่างไร คุณมีข้อเสนอแนะใด?

1
คำสั่งที่เกี่ยวข้องกับเลขคณิตคู่, Dash, POSIX เชลล์, sh, Increment
เมื่อก่อน / หลังการเพิ่มตัวแปรใน POSIX Shell ความแตกต่างระหว่างสองตัวอย่างนี้คืออะไร พวกเขาดูเหมือนว่าพวกเขาจะมีผลที่เหมือนกัน แต่พวกเขาจะใช้แตกต่างกันอย่างไร เมื่อไหร่ที่คุณจะชอบอีกอันหนึ่ง? X=$((X+1)) : $((X=X+1))

3
เชลล์ล่ามคนใดเรียกใช้สคริปต์โดยไม่มี shebang?
สมมติว่าเชลล์เริ่มต้นสำหรับบัญชีของฉันคือ zsh แต่ฉันเปิดเทอร์มินัลและยิงทุบตีและเรียกใช้สคริปต์ชื่อprac002.shซึ่งล่ามเชลล์ใดที่จะใช้ในการรันสคริปต์ zsh หรือ bash? ลองพิจารณาตัวอย่างต่อไปนี้: papagolf@Sierra ~/My Files/My Programs/Learning/Shell % sudo cat /etc/passwd | grep papagolf [sudo] password for papagolf: papagolf:x:1000:1001:Rex,,,:/home/papagolf:/usr/bin/zsh # papagolf's default shell is zsh papagolf@Sierra ~/My Files/My Programs/Learning/Shell % bash # I fired up bash. (See that '%' prompt in zsh changes to '$' prompt, …

4
ฉันจะใช้ตัวแปรเป็นเงื่อนไขเคสได้อย่างไร?
ฉันพยายามที่จะใช้ตัวแปรประกอบด้วยสตริงที่แตกต่างกันแยกออกจากกันด้วยความ|เป็นcaseทดสอบคำสั่ง ตัวอย่างเช่น: string="\"foo\"|\"bar\"" read choice case $choice in $string) echo "You chose $choice";; *) echo "Bad choice!";; esac ฉันต้องการที่จะพิมพ์fooหรือbarดำเนินการส่วนแรกของcaseคำสั่ง อย่างไรก็ตามทั้งสองfooและbarพาฉันไปที่สอง: $ foo.sh foo Bad choice! $ foo.sh bar Bad choice! ใช้"$string"แทน$stringทำให้ไม่มีความแตกต่าง string="foo|bar"ไม่ไม่ใช้ ฉันรู้ว่าฉันสามารถทำได้ด้วยวิธีนี้: case $choice in "foo"|"bar") echo "You chose $choice";; *) echo "Bad choice!";; esac ฉันสามารถคิดถึงวิธีแก้ปัญหาต่าง ๆ แต่ฉันต้องการทราบว่าเป็นไปได้ที่จะใช้ตัวแปรเป็นcaseเงื่อนไขในการทุบตี เป็นไปได้และถ้าเป็นเช่นนั้นได้อย่างไร

1
ลบบรรทัดที่ค่าของฟิลด์น้อยกว่าหรือเท่ากับ 3 - sed หรือ awk?
ฉันต้องการลบทุกบรรทัดที่มีค่า 2 หรือน้อยกว่าในฟิลด์ที่ 8 (คอลัมน์) ข้อมูลของฉันมีลักษณะเช่นนี้: 12-31 Airport 189 379 41 49.70946503 -124.91377258 2 2880 30.8 01-01 AlberniElementary 165 331 16 49.26100922 -124.80662537 4 5760 26.1 01-09 BamfieldMarine 161 323 23 48.83490372 -125.13572693 2 2875 27.4 01-10 BamfieldMarine 161 323 23 48.83490372 -125.13572693 3 3068 38.6 ฉันเข้าใจว่าการใช้ awk ฉันสามารถตัดค่าที่ต้องการและพิมพ์ไปยังไฟล์อื่นและฉันเข้าใจว่า sed …
17 shell  shell-script  sed  awk  grep 

5
สำรวจไดเรกทอรีย่อยทั้งหมดในและทำบางสิ่งใน Unix shell script
ฉันต้องการเชลล์สคริปต์ของฉันเพื่อเยี่ยมชมไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีหลัก ทำบางสิ่งในไดเรกทอรีส่งออกไปยังไฟล์สปูลและย้ายไปยังไดเรกทอรีถัดไป พิจารณา Dir หลัก = / tmp Sub Dir = ABCD (ไดเรกทอรีย่อยสี่แห่ง)

2
วิธีตั้งค่าตัวแปรสภาวะแวดล้อมโกลบอลเมื่อบูตผ่านสคริปต์และให้พร้อมใช้งานสำหรับแอ็พพลิเคชันที่รันก่อนล็อกอิน?
ฉันมีบริการที่ทำงานตอนบู๊ตและในบริการนั้นจะเรียกสคริปต์ทุบตีในพื้นหลังที่ส่งออกตัวแปรสภาพแวดล้อมบางอย่าง ปัญหาที่ฉันมีคือตัวแปรสภาพแวดล้อมเหล่านั้นไม่ได้ถูกส่งไปยังพาเรนต์ของกระบวนการพื้นหลังดังนั้นทันทีที่สคริปต์ของฉันทำงานเสร็จพวกเขาก็หายไป นอกจากนี้หลังจากที่เรียกใช้สคริปต์แล้วบริการจะเรียกใช้สคริปต์อื่นที่เริ่มต้นแอปพลิเคชันที่ฉันมี แอปพลิเคชันนี้ต้องการการเข้าถึงตัวแปรสภาพแวดล้อมเหล่านั้น ระบบ RHEL ที่ฉันใช้งานนั้นมีไว้สำหรับผู้ใช้ที่ไม่เคยลงชื่อเข้าใช้ระบบจะบู๊ตและเริ่มแอปพลิเคชันเท่านั้น ฉันรู้ว่าตัวแปรสภาพแวดล้อมสำหรับกระบวนการผู้ปกครอง / เปลือกไม่สามารถจริงๆตั้งค่าได้โดยเปลือกกระบวนการพื้นหลังเด็กแม้ว่า ฉันต้องการวิธีการทำสิ่งนี้ผ่านสคริปต์ที่ถูกเรียกใช้โดยบริการของฉัน (ไม่จำเป็นต้องอยู่ในพื้นหลัง) ไม่ใช่โดยการเพิ่มเข้าไปในบริการของฉัน (ซึ่งไม่ได้ผลสำหรับฉัน) และไม่เก็บไว้ใน/etc/environmentหรือ.profileหรืออะไรเช่นนั้น ในบริการของฉันฉันพยายามเพิ่มตัวแปรสภาพแวดล้อม (ไม่ใช่สิ่งที่ฉันต้องการจะทำ): export TEST=192.168.1.1 ฉันลองสิ่งนี้ในบริการของฉันด้วย: TEST=192.168.1.1 export TEST=${TEST} ฉันพยายามเปลี่ยนวิธีการให้บริการของฉันเรียกสคริปต์ทุบตี: /bin/asdf/script & ฉันยังพยายามจัดหาสคริปต์เพื่อให้ทำงานในเชลล์เดียวกัน (ซึ่งฉันได้รับจากสิ่งนี้ ): . ./bin/asdf/script #I'm very confused why this didn't work ฉันพบสิ่งนี้ซึ่งดูน่าสนใจ แต่มันก็ไม่ได้แปลกในกรณีของฉัน

4
ฉันจะจัดการสวิตช์ในเชลล์สคริปต์ได้อย่างไร
มีเครื่องมือในตัวที่จะรับรู้-xและ--xxxxเป็นสวิตช์และไม่ขัดแย้งหรือคุณต้องผ่านตัวแปรอินพุททั้งหมดทดสอบการขีดกลางแล้วจึงแยกอาร์กิวเมนต์หลังจากนั้น

4
จะแทนที่ช่องว่างในชื่อไฟล์ทั้งหมดด้วยเครื่องหมายขีดล่างใน Linux โดยใช้เชลล์สคริปต์ได้อย่างไร
ฉันลองต่อไปนี้เชลล์สคริปต์ซึ่งควรแทนที่ช่องว่างจากชื่อไฟล์ xml ทั้งหมด for xml_file in $(find $1 -name "* .xml" -type f); do echo "removing spaces from XML file:" $xml_file mv "$xml_file" "${xml_file// /_}"; done สมมติว่าฉันมีไฟล์ xml ที่มีชื่อxy z.xmlจากนั้นจะให้: removing spaces from XML file: /home/krishna/test/xy mv: cannot stat `/home/krishna/test/xy': No such file or directory removing spaces from XML file: …

4
วิธีการเปิดเทอร์มินัลแยกไปที่เทอร์มินัล 9 รายการและสลับระหว่างกันโดยใช้หนึ่งสคริปต์
ฉันต้องการเปิดเทอร์มินัลแยกออกเพื่อให้บอกว่ามี 9 ส่วน (3x3) และรันสคริปต์ทุบตี แต่สำหรับเทอร์มินัลแต่ละส่วนจะมีสคริปต์ที่แตกต่างกัน สิ่งนี้สามารถทำได้โดยใช้ Perl, Python หรือแม้กระทั่งทุบตี? ฉันจะสลับระหว่างเทอร์มินัลตัวเล็ก ๆ เหล่านั้นโดยไม่ใช้แป้นพิมพ์ลัดได้อย่างไร terminatorโอ้โดยวิธีการที่ผมใช้ และถ้ามีเทอร์มินัลอีมูเลเตอร์อื่นที่เปิดใช้งานฟังก์ชั่นนี้มันคืออะไร?

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