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

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

2
ส่งผ่านพารามิเตอร์บรรทัดคำสั่งไปยังโปรแกรมภายในเชลล์สคริปต์
ในฐานะที่เป็น./script.sh arg1 [arg2 arg3 ...]ข้อโต้แย้งบรรทัดคำสั่งarg1, arg2... สามารถได้โดย$1, $2... แต่จำนวนของการขัดแย้งจะไม่ได้รับการแก้ไข ในเชลล์สคริปต์ฉันต้องการส่งอาร์กิวเมนต์ที่เริ่มต้นจากarg2ไปยังโปรแกรม #/bin/bash ... /path/to/a/program [I want to pass arg2 arg3 ... to the program] ... ฉันจะทำอย่างไรเพราะอาจมีข้อโต้แย้งอย่างน้อยหนึ่งข้อ

6
ฉันจะรอไฟล์ในเชลล์สคริปต์ได้อย่างไร
ฉันพยายามเขียนเชลล์สคริปต์ที่จะรอให้ไฟล์ปรากฏใน/tmpไดเรกทอรีที่เรียกsleep.txtและเมื่อพบว่าโปรแกรมจะหยุดทำงานมิฉะนั้นฉันต้องการให้โปรแกรมอยู่ในสถานะสลีป (ถูกระงับ) จนกว่าไฟล์จะอยู่ . ตอนนี้ฉันสมมติว่าฉันจะใช้คำสั่งทดสอบ ดังนั้นสิ่งที่ชอบ (if [ -f "/tmp/sleep.txt" ]; then stop else sleep.) ฉันใหม่เอี่ยมสำหรับการเขียนเชลล์สคริปต์และความช่วยเหลือใด ๆ ที่ได้รับการชื่นชมอย่างมาก!

3
Bash เกิดข้อผิดพลาดบรรทัดที่ 8: $ 1: ตัวแปรที่ไม่ถูกผูก
ฉันพยายามที่จะเรียนรู้วิธีใช้ getopts เพื่อที่ฉันจะได้สคริปต์ที่มีการวิเคราะห์คำ (แม้ว่าฉันคิดว่า getopts น่าจะดีกว่า) ฉันพยายามเขียนสคริปต์ง่าย ๆ เพื่อคืนค่าเปอร์เซ็นต์การใช้งานพาร์ติชัน ปัญหาคือว่าหนึ่งในฟังก์ชั่นทุบตีของฉันดูเหมือนจะไม่ชอบที่ฉันอ้างอิง$1เป็นตัวแปรภายในฟังก์ชั่น เหตุผลที่ฉันอ้างอิง$1เป็นเพราะget_percentฟังก์ชั่นสามารถส่งผ่านจุดเมานท์เป็นอาร์กิวเมนต์เพิ่มเติมเพื่อแสดงแทนจุดเมานท์ทั้งหมด สคริปต์ #!/usr/bin/bash set -e set -u set -o pipefail get_percent(){ if [ -n "$1" ] then df -h $1 | tail -n +2 | awk '{ print $1,"\t",$5 }' else df -h | tail -n +2 | awk '{ …

7
วิธีตรวจสอบไดเรกทอรีว่างเปล่า
ฉันมีข้อกำหนดถ้าฉันเรียกใช้สคริปต์./123ด้วยอาร์กิวเมนต์ของพา ธ ว่างให้พูด/usr/share/linux-headers-3.16.0-34-generic/.tmp_versions(ไดเรกทอรีนี้ว่างเปล่า) มันควรจะแสดง "ไดเรกทอรีว่างเปล่า" รหัสของฉันคือ: #!/bin/bash dir="$1" if [ $# -ne 1 ] then echo "please pass arguments" exit fi if [ -e $dir ] then printf "minimum file size: %s\n\t%s\n" \ $(du $dir -hab | sort -n -r | tail -1) printf "maximum file size: %s\n\t%s\n" \ $(du …

7
bash loop ผ่านรายการของสตริง
เป็นไปได้หรือไม่ที่จะจัดรูปแบบตัวอย่างนี้: for i in string1 string2 stringN do echo $i done สิ่งที่คล้ายกับนี้: for i in string1 string2 stringN do echo $i done แก้ไข: ขออภัยในความสับสนไม่ทราบว่ามีวิธีการดำเนินการสคริปต์ที่แตกต่างกัน - sh <scriptname>เทียบกับbash <scriptname>และสิ่งที่ฉันไม่สามารถตั้งชื่อได้ตอนนี้ - #!/bin/shและ#!/bin/bash:)

2
Shebang นี้เริ่มต้นด้วยเครื่องหมายขีดคั่นคู่ (-) อย่างไร
ฉันได้พบ shebang ประเภทต่อไปนี้ในหน้า RosettaCode: --() { :; }; exec db2 -txf "$0" มันใช้งานได้สำหรับ Db2 และสิ่งที่คล้ายกันสำหรับ Postgres อย่างไรก็ตามฉันไม่เข้าใจทั้งบรรทัด ฉันรู้ว่าเส้นประสองครั้งเป็นความคิดเห็นใน SQL และหลังจากนั้นมันเรียกการปฏิบัติการ Db2 ด้วยพารามิเตอร์บางตัวที่ส่งไฟล์ตัวเองเป็นไฟล์ แต่สิ่งที่เกี่ยวกับวงเล็บวงเล็บปีกกาลำไส้ใหญ่และเซมิโคลอนและวิธีสามารถแทนที่ shebang # จริง! ? https://rosettacode.org/wiki/Multiline_shebang#PostgreSQL

2
แปลง xlsx เป็น xls ในสคริปต์เชลล์ linux
ฉันต้องแปลงไฟล์ ".xlsx" เป็น ".xls" โดยใช้คำสั่ง shell ที่ทำงานของฉันเรากำลังใช้คำสั่ง xlsx2csv แต่ตอนนี้ความต้องการมีการเปลี่ยนแปลงและเราจำเป็นต้องแปลงไฟล์ ".xlsx" ทั้งหมดเป็นไฟล์ ".xls" เพื่อการคำนวณเพิ่มเติม สำหรับสิ่งนั้นคนที่ทำงานของฉันได้พัฒนาคำสั่งเดียวที่สามารถแปลง ".xlsx" เป็น ".xls" แต่สามารถใช้ได้กับแผ่นงานเดียวเท่านั้น .. เรามีหลายแผ่นในหนึ่งไฟล์ ขอบคุณล่วงหน้า....

1
มีวิธีใดที่จะบอกได้ว่าเชลล์สคริปต์ถูกฆ่าด้วยสัญญาณ 9
ฉันมีสคริปต์ทุบตี (เรียกจากโปรแกรมจาวา) ที่ยังคงถูกฆ่า ฉันมักจะจับsignal 15ด้วยtrapแต่แล้วบางส่วนสัญญาณอื่น ๆ ที่มาพร้อมที่ฉันสงสัยว่าเป็นแต่ฉันในพื้นตาบอดเป็นไปได้ถ้ามันเป็นจริงsignal 9signal 9 ฉันรู้ว่าคุณไม่สามารถtrap signal 9มีวิธีอื่นที่ฉันสามารถบอกได้ว่าsignal 9กำลังฆ่าเชลล์สคริปต์ของฉันหรือไม่

1
POSIX เทียบเท่ากับการหมดเวลาของ GNU หรือไม่
timeoutคำสั่งGNU coreutils มีประโยชน์อย่างยิ่งสำหรับสถานการณ์การเขียนสคริปต์บางอย่างซึ่งอนุญาตให้ใช้เอาต์พุตของคำสั่งหากมันรวดเร็วในการเรียกใช้และข้ามมันหากมันใช้เวลานานเกินไป ฉันจะประมาณพฤติกรรมพื้นฐานของการtimeoutใช้ยูทิลิตี้ที่ระบุเฉพาะ POSIX ได้อย่างไร (ฉันคิดว่ามันอาจจะเกี่ยวข้องกับการรวมกันของwait, sleep, killและผู้ที่รู้สิ่งอื่น แต่บางทีฉันหายไปวิธีการที่ง่ายขึ้น.)

2
ฉันจะสร้างและเข้าถึงไฟล์ temp จาก shell script ได้อย่างปลอดภัยได้อย่างไร?
ฉันได้อ่านแล้วว่าการเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์ชื่อคงที่/tmpอาจเป็นความเสี่ยงด้านความปลอดภัยเพราะหากผู้โจมตี (หรือผู้กระทำความผิด) สังเกตเห็นว่าไฟล์/tmp/tmpfileformyscript.tmpถูกสร้างขึ้นเมื่อฉันเรียกใช้สคริปต์ของฉัน (แม้ว่าเขาจะไม่สามารถเข้าถึงการอ่านของฉัน สคริปต์) ตัวอย่างเช่นเขาสามารถสร้าง symlink ln -s ~wildcard/.bashrc /tmp/tmpfileformyscript.tmpซึ่งจะทำให้ฉันทำลาย.bashrcไฟล์ของฉันเมื่อฉันเรียกใช้สคริปต์ของฉัน ดังนั้นฉันสามารถใช้สิ่งที่ชอบfilename="tmpfile.tmp.$RANDOM" ; echo outputtext > "$filename"แทน อย่างไรก็ตามฉันต้องการใช้ไฟล์ tmp สำหรับการแคชในบางครั้งซึ่งในกรณีนี้ฉันต้องการทราบว่า "tmpfile.tmp. *" ตรงกับทุกอย่างใน/tmpนั้นหรือไม่และใช้ไฟล์นั้นแทนการสร้างไฟล์ใหม่หรือไม่ น่าเสียดายtestและสิ่งที่เทียบเท่า[ -f filename ]ไม่สนับสนุนไฟล์ที่ทำให้กลมกลืนไปเท่าที่ฉันสามารถบอกได้ ดังนั้นคำถามของฉันคือสองเท่า: ฉันจะสร้าง tempfile อย่างปลอดภัยได้อย่างไร คือ"predictablename.$RANDOM"การปฏิบัติที่ได้รับการยอมรับหรือมีที่ดีกว่า (ความปลอดภัยมากขึ้นง่ายขึ้น) วิธี? ฉันจะเข้าถึงไฟล์และ / หรือสร้างการมีอยู่ของไฟล์ได้ในภายหลังโดยการตรวจสอบได้predictablenameอย่างไร?

3
จะลบคอลัมน์หรือหลายคอลัมน์ออกจากไฟล์โดยใช้คำสั่ง shell ได้อย่างไร
ไฟล์ของฉัน ARCHIVE B1_NAME B2_NAME B3_NAME ELEMENT INFO_NAM WERT PROCID -------- -------- -------- -------- -------- -------- ---- ------ 15MinAvg AIRSS 33-GIS DMDMGIS1 I MvAvr15m 1123 CP 15MinAvg AIRSS 33-GIS DMDMGIS1 P MvAvr15m 2344 CP 15MinAvg AIRSS 33-GIS DMDMGIS1 Q MvAvr15m 4545 CP 15MinAvg AIRSS 33-GIS DMDMGIS2 I MvAvr15m 6576 CP 15MinAvg …


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

9
กรองหรือไพพ์บางส่วนของไฟล์
ฉันมีไฟล์อินพุตที่มีบางส่วนและถูกแบ่งเขตด้วยแท็กเริ่มต้นและแท็กสิ้นสุดตัวอย่างเช่น: line A line B @@inline-code-start line X line Y line Z @@inline-code-end line C line D ฉันต้องการนำการแปลงไปใช้กับไฟล์นี้เพื่อให้บรรทัด X, Y, Z ถูกกรองผ่านคำสั่งบางอย่าง ( nlตัวอย่างเช่น) แต่ส่วนที่เหลือของบรรทัดนั้นไม่ผ่านการเปลี่ยนแปลง โปรดสังเกตว่าnl(จำนวนบรรทัด) สะสมสถานะข้ามบรรทัดดังนั้นจึงไม่ใช่การแปลงแบบสแตติกที่ถูกนำไปใช้กับแต่ละบรรทัด X, Y, Z ( แก้ไข : มันชี้ให้เห็นว่าnlสามารถทำงานในโหมดที่ไม่ต้องการสถานะสะสม แต่ฉันแค่ใช้nlเป็นตัวอย่างในการทำให้คำถามง่ายขึ้นในความเป็นจริงคำสั่งเป็นสคริปต์ที่กำหนดเองที่ซับซ้อนมากขึ้นสิ่งที่ฉันกำลังมองหา for เป็นคำตอบทั่วไปสำหรับปัญหาในการใช้ตัวกรองมาตรฐานกับส่วนย่อยของอินพุตไฟล์ ) ผลลัพธ์ควรมีลักษณะดังนี้: line A line B 1 line X 2 line Y 3 …

6
คัดลอกกุญแจสาธารณะ ssh ไปยังโฮสต์ Linux หลายตัว
ฉันพยายามคัดลอก. ssh / id_rsa.pub จากเซิร์ฟเวอร์กลางของเราไปยังเซิร์ฟเวอร์หลายเครื่อง ฉันมีสคริปต์ต่อไปนี้ซึ่งฉันมักจะใช้เพื่อผลักดันการเปลี่ยนแปลงไปยังเซิร์ฟเวอร์ที่แตกต่างกัน #!/bin/bash for ip in $(<IPs); do # Tell the remote server to start bash, but since its # standard input is not a TTY it will start bash in # noninteractive mode. ssh -q "$ip" bash <<-'EOF' EOF done แต่ในกรณีนี้ฉันต้องกำหนดคีย์สาธารณะบนเซิร์ฟเวอร์ภายในแล้วเพิ่มไปยังเซิร์ฟเวอร์หลายเครื่อง มีวิธีโดยใช้สคริปต์เอกสารข้างต้นที่นี่เพื่อดำเนินการดังต่อไปนี้ cat .ssh/id_rsa.pub |ssh …
14 shell-script  ssh 

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