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

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


3
$ {1: 0: 2} หมายถึงอะไรในบริบทนี้
ฉันกำลังมองเข้าไปในรหัสที่แสดงด้านล่างและจะตรวจสอบการป้อนข้อมูลถ้าอาร์กิวเมนต์แถว / คอลัมน์เริ่มต้นด้วยอย่างใดอย่างหนึ่งหรือ-r -cอะไร${1:0:2}หมายถึงในบริบทนี้? rowArgName="-r" colArgName="-c" if [ "${1:0:2}" != $rowArgName ] && [ "${1:0:2}" != $colArgName ] then echo $correctCmdMsg >&2 exit 1 fi


2
วิธีการ ls โดยไม่ต้องเรียกซ้ำ
ฉันพยายาม ls บางไฟล์ที่มีรูปแบบในไดเรกทอรี ฉันแค่ต้องการสแกนระดับแรกไม่ใช่เรียกซ้ำ สคริปต์ของฉัน: for i in $(ls $INCOMINGDIR/*$BUSSINESSDATE*) do echo $i; done คำสั่งข้างต้นสแกนซ้ำ จะทำให้มันสแกนไดเรกทอรีระดับแรกเท่านั้นได้อย่างไร
19 bash  shell-script  ls 

9
ทดสอบว่ามีการตั้งค่าตัวแปรหลายตัว
ฉันต้องการตรวจสอบให้แน่ใจว่า ณ จุดหนึ่งของสคริปต์หลังจากsourceการตั้งค่าไฟล์ตัวแปรหลายตัวจะถูกตั้งค่าและหากไม่ใช่เพื่อหยุดการประมวลผลให้บอกผู้ใช้เกี่ยวกับตัวแปรที่หายไป ฉันเหนื่อย for var in $one $two $three ; do ... แต่ถ้ายกตัวอย่างเช่นไม่ได้ตั้งวงไม่เคยประหารชีวิต$two $twoสิ่งต่อไปที่ฉันลองคือ for var in one two three ; do if [ -n ${!var} ] ; then echo "$var is set to ${!var}" else echo "$var is not set" fi done แต่ถ้าทั้งสองไม่ได้ตั้งค่าฉันยังคงได้รับ "two ถูกตั้งค่าเป็น" แทนที่จะเป็น "two is …

8
หลีกเลี่ยงการรอไม่ว่างในการทุบตีโดยไม่มีคำสั่ง sleep
ฉันรู้ว่าฉันสามารถรอเงื่อนไขที่จะกลายเป็นจริงในการทุบตีโดยทำ: while true; do test_condition && break sleep 1 done แต่จะสร้างกระบวนการย่อย 1 กระบวนการในการทำซ้ำแต่ละครั้ง (sleep) ฉันสามารถหลีกเลี่ยงพวกเขาโดยทำ: while true; do test_condition && break done แต่มันใช้ CPU เป็นจำนวนมาก (กำลังรอไม่ว่าง) เพื่อหลีกเลี่ยงกระบวนการย่อยและการรอคอยไม่ว่างฉันจึงตัดสินใจแก้ปัญหาดังกล่าว แต่ฉันพบว่ามันน่าเกลียด my_tmp_dir=$(mktemp -d --tmpdir=/tmp) # Create a unique tmp dir for the fifo. mkfifo $my_tmp_dir/fifo # Create an empty fifo for sleep by …

7
วิธีเติมส่วนหัวของใบอนุญาตแบบซ้ำ ๆ สำหรับไฟล์. h และ. cpp ทั้งหมดในไดเรกทอรี
ฉันกำลังพยายามเพิ่มส่วนหัวของใบอนุญาตให้กับไฟล์ส่วนหัวและไฟล์ต้นฉบับในไดเรกทอรีโครงการโดยใช้ for loop วิธีนี้ใช้ไม่ได้มีวิธีอื่นอีกsedไหมที่ใช้?

2
ฉันจะทดสอบเพื่อดูว่ามีแอปพลิเคชันอยู่ใน $ PATH ได้อย่างไร
ฉันพยายามที่จะเขียนshสคริปต์เริ่มต้น / env ทั้งหมดของฉันเพื่อทำงานกับDRYให้มากที่สุดเท่าที่จะเป็นไปได้: "ใช้ได้กับทุก ๆ * * * * * * * * * * * * * * * * * * * * * * * นี่หมายถึงการทำให้แน่ใจว่าถ้าฉันพยายามเรียกใช้รหัสที่ไม่มีอยู่นั้นรหัสนั้นจะล้มเหลวอย่างงดงาม ด้วยเหตุนี้ฉันต้องสามารถทดสอบว่ามีโปรแกรมอยู่หรือไม่ ฉันรู้วิธีทดสอบว่ามีไฟล์อยู่หรือไม่ แต่ฉันไม่แน่ใจว่าจะทดสอบอย่างไรเพื่อดูว่าแอปพลิเคชันสามารถทำงานได้ภายในพา ธ หรือไม่ ฉันควรใช้ $ PATH เนื่องจากบางส่วนของสิ่งเหล่านี้จำเป็นต้องใช้กับ arch, ubuntu และ centos บางระบบอาจถูกติดตั้งในบ้านของฉันในระบบที่ฉันไม่มีรูทและบางระบบอาจไม่ได้ติดตั้งและอื่น ๆ ที่ติดตั้งในพา ธ ของระบบ

6
ใช้คำสั่งกับไฟล์จำนวนมาก
ฉันมีโฟลเดอร์ที่มีไฟล์จำนวนมาก (xyz1, xyz2 ไปจนถึง xyz5025) และฉันต้องเรียกใช้สคริปต์ในทุก ๆ ไฟล์รับ xyz1.faa, xyz2.faa และอื่น ๆ คำสั่งสำหรับไฟล์เดียวคือ: ./transeq xyz1 xyz1.faa -table 11 มีวิธีการทำเช่นนั้นโดยอัตโนมัติหรือไม่? อาจจะเป็นคำสั่งผสมที่ต้องทำ?

4
มันเป็นวิธีที่มีเหตุผลในการ“ สำรองข้อมูล” ตัวแปร $ IFS หรือไม่
ฉันลังเลที่จะยุ่งกับ$IFSมันอยู่เสมอเพราะมันเป็นสิ่งที่ขัดขวางโลก แต่บ่อยครั้งมันทำให้การโหลดสตริงลงในอาเรย์ของ bash นั้นดีและกระชับและสำหรับสคริปของ bash นั้นความรัดกุมยากที่จะเกิดขึ้น ดังนั้นฉันคิดว่ามันอาจจะดีกว่าไม่มีอะไรถ้าฉันพยายามที่จะ "บันทึก" เนื้อหาเริ่มต้นของ$IFSตัวแปรอื่นแล้วคืนค่าทันทีหลังจากที่ฉันใช้$IFSบางสิ่งบางอย่าง เป็นจริงหรือไม่? หรือว่ามันไร้ประโยชน์อย่างยิ่งและฉันควรตั้งค่าIFSกลับไปที่สิ่งที่จำเป็นสำหรับการใช้งานในภายหลังโดยตรง

8
การเรียกใช้สคริปต์ทุบตีหลาย ๆ ชุดและเรียกใช้พร้อมกันไม่ใช่เรียงตามลำดับ
สมมติว่าฉันมีสาม (หรือมากกว่า) สคริปต์ทุบตี: script1.sh, และscript2.sh script3.shผมอยากจะเรียกทั้งสามของสคริปต์เหล่านี้และเรียกพวกเขาในแบบคู่ขนาน วิธีหนึ่งในการทำเช่นนี้คือเพียงเรียกใช้คำสั่งต่อไปนี้ nohup bash script1.sh & nohup bash script2.sh & nohup bash script3.sh & (โดยทั่วไปสคริปต์อาจใช้เวลาหลายชั่วโมงหรือหลายวันจึงจะเสร็จสิ้นดังนั้นฉันต้องการใช้nohupเพื่อให้สคริปต์ทำงานต่อไปแม้ว่าคอนโซลของฉันจะปิด) แต่มีวิธีใดบ้างที่จะดำเนินการคำสั่งทั้งสามนี้ควบคู่กับการโทรครั้งเดียว ? ฉันกำลังคิดอะไรบางอย่างเช่น nohup bash script{1..3}.sh & แต่นี้จะปรากฏในการดำเนินการscript1.sh, script2.shและscript3.shในลำดับที่ไม่ได้อยู่ในแบบคู่ขนาน

6
ฉันจะพิมพ์เฉพาะคำสั่งบางอย่างจากสคริปต์ทุบตีขณะที่ทำงานได้อย่างไร
ฉันมีสคริปต์ทุบตีด้วยถ้าคำสั่งต่างๆตามอาร์กิวเมนต์บรรทัดคำสั่งที่ฉันผ่านเมื่อเรียกมัน การมีเอาต์พุตบางอย่างเกี่ยวกับคำสั่งที่กำลังรันอยู่มีประโยชน์ในการยืนยันการไหลของข้อมูลทั้งหมดหากข้อความสั่ง แต่โซลูชันปัจจุบันของฉันให้ข้อมูลมากเกินไป การใช้set -vในสคริปต์ค่อนข้างมีประโยชน์ในการดูคำสั่งที่พิมพ์บนหน้าจอขณะที่รันในสคริปต์ แต่ฉันได้รับคำสั่งมากเกินไป มันเกือบจะเหมือนสำเนาทั้งหมดของสคริปต์ ฉันต้องการเอาต์พุตที่แสดงว่าคำสั่งใดกำลังทำงานอยู่ แต่ฉันไม่ต้องการเห็นข้อคิดเห็นบรรทัดใหม่นิพจน์ใน if statement ฯลฯ มีวิธีที่ฉันสามารถส่งออกเป็นไปได้ทั้งหมดที่สร้างขึ้นโดยตัวเลือก -v ผ่าน regex ก่อนที่จะถูกพิมพ์? หรือวิธีอื่น ๆ ในการรับ bash ไปยังคำสั่งเอาต์พุตของ "type" บางอย่างเท่านั้น (เช่นที่กำลังใช้ executables และไม่เพียงแค่ bash statement เฉพาะข้อคิดเห็น ฯลฯ หรือไม่) [1] /programming/257616/sudo-changes-path-whyมีประโยชน์มากในเรื่องนี้และเป็นที่ที่ฉันได้รับคำแนะนำสำหรับการset -vใช้งาน แก้ไข : สคริปต์ที่คล้ายกัน (แต่ไม่เหมือนกัน) กับสคริปต์ที่ฉันใช้: #!/bin/bash #get verbose command output set -v env=$1 if [ …


2
ไม่แสดงเอาต์พุตยกเว้นโค้ดออกที่ไม่ใช่ศูนย์
อะไรคือวิธีที่ดีที่สุดในการระงับเอาต์พุต (stdout และ stderr) ยกเว้นว่าโปรแกรมออกด้วยรหัสที่ไม่ใช่ศูนย์ ฉันกำลังคิด: quiet_success() { file=$(mktemp) if ! "$@" > "$file" 2>&1; then cat "$file" fi rm -f "$file" } และวิ่งquiet_success my_long_noisy_script.shแต่ฉันไม่แน่ใจว่ามีวิธีที่ดีกว่า ฉันรู้สึกว่าสิ่งนี้จะต้องเป็นสิ่งที่คนอื่น ๆ ต้องทำ สำหรับบริบทฉันต้องการเพิ่มสคริปต์ cron ของฉันเพื่อที่ฉันจะได้รับอีเมลทุกอย่างหากพวกเขาล้มเหลว แต่ไม่ใช่ถ้าพวกเขาทำไม่ได้

6
ค้นหาค่าสูงสุดของคอลัมน์ 1 และพิมพ์ระเบียนที่เกี่ยวข้องจากคอลัมน์ 2 จากไฟล์
วิธีค้นหาค่าสูงสุดจากคอลัมน์ 1 และ echo ตำแหน่งพา ธ ตามลำดับจากไฟล์ที่มีจำนวนเรคคอร์ด $ cat version.log 112030 /opt/oracle/app/oracle/product/11.2.0 121010 /opt/oracle/app/oracle/product/12.1.0 ผลลัพธ์ที่คาดหวัง: /opt/oracle/app/oracle/product/12.1.0

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