คำถามติดแท็ก bash-scripting

การทำสคริปต์ Bash กำลังสร้างสคริปต์ในภาษา Bash shell


8
ระงับการติดตามการเรียกใช้งานสำหรับคำสั่ง echo หรือไม่
ฉันทำงานเชลล์สคริปต์จากเจนกินส์ซึ่ง kicks #!/bin/sh -exปิดเชลล์สคริปต์ที่มีตัวเลือก ตามBash Shebang สำหรับหุ่น? ,, -x"ทำให้เชลล์พิมพ์การติดตามการดำเนินการ" ซึ่งดีมากสำหรับวัตถุประสงค์ส่วนใหญ่ - ยกเว้น echos: echo "Message" ผลิตผลลัพธ์ + echo "Message" Message ซึ่งค่อนข้างซ้ำซ้อนและดูแปลกไปหน่อย มีวิธีที่จะ-xเปิดใช้งาน แต่มีเฉพาะเอาต์พุต Message แทนที่จะเป็นสองบรรทัดด้านบนเช่นโดยนำหน้าคำสั่ง echo ด้วยอักขระคำสั่งพิเศษหรือเปลี่ยนเส้นทางเอาต์พุต

3
ZSH: คำสั่งอ่านล้มเหลวภายในฟังก์ชันทุบตี“ อ่าน: 1: -p: ไม่มีตัวประมวลผลร่วม”
แก้ไข: bashดูเหมือนว่าการทำงานภายใน zshแต่ดูเหมือนว่ามันมีปัญหาที่เกี่ยวข้องกับ หากมีเว็บไซต์ที่ดีกว่าในการโพสต์ปัญหานี้ให้ฉันทราบ ฉันกำลังเขียนสคริปต์ง่ายๆที่สร้างชุดไดเรกทอรี ฉันต้องการให้ผู้ใช้ยืนยันก่อนที่จะทำเช่นนั้น ฉันใช้สิ่งต่อไปนี้เป็นพื้นฐาน แต่ดูเหมือนจะไม่สามารถทำให้มันทำงานภายในฟังก์ชันทุบตีได้ ถ้าฉันวางมันไว้นอกฟังก์ชั่น นี่คือตัวอย่างที่แยกได้: read.sh #!/bin/bash test() { read -p "Here be dragons. Continue?" -n 1 -r if [[ $REPLY =~ ^[Yy]$ ]] then echo "You asked for it..." fi } รหัสจากนี้โพสต์ SO จัดหาไฟล์และ / หรือผลในข้อผิดพลาดต่อไปนี้:test read:1: -p: no coprocessเอาท์พุทเดียวกันเมื่อฉันวางไว้ในของฉัน.bashrc แก้ไข :: @hennes ฉันต้องการให้ฟังก์ชั่นอยู่ในไฟล์ …

3
วิธีอัปเดต bash บน Mac OS X Yosemite
เพียงแค่พยายามเรียนรู้การทุบตีสคริปต์เล็กน้อย รุ่นทุบตีเก่าของฉัน: Bash version 3.2.53(1)-release... ฉันได้อัปเดตทุบตีบน mac os x yosemite ด้วย homebrew: brew update brew install bash จากนั้นในคุณสมบัติขั้วฉันได้เปลี่ยนเส้นทางมาตรฐานเปลือกจาก/bin/bashไป/usr/local/bin/bash(ตามที่ผมเข้าใจนี่คือที่ homebrew ติดตั้งทุบตีปรับปรุง) จากนั้นฉันตรวจสอบผลลัพธ์อีกครั้ง (และดูเหมือนว่าจะดีทั้งหมด): $ echo $BASH_VERSION Bash version 4.0.33(0)-release... แต่เมื่อฉันพยายามเขียนสคริปต์ทุบตีง่าย: #!/bin/bash echo "Bash version ${BASH_VERSION}..." for i in {0..10..2} do echo "Welcome $i times" done ผลลัพธ์คือ: Bash version 3.2.53(1)-release... Welcome {0..10..2} …

2
ฉันจะเปรียบเทียบตัวแปรกับสตริงข้อความแทนที่จะเป็นจำนวนเต็มในคำสั่ง if / else ได้อย่างไร
ในขั้นตอนการเขียนเชลล์สคริปต์ฉันพบปัญหาด้วยคำสั่ง if / else ต่อไปนี้ซึ่งอยู่ตรงกลางของสคริปต์: if [ $act -eq "add" ] then read - "add or update: " $comm git commit -m "$comm $file" else git commit -m "$act $file" fi ข้อผิดพลาดที่กลับมาเป็น: ./gitup: line 13: [: add: integer expression expected แล้วจึงดำเนินการกับส่วนที่เหลือของสคริปต์ ฉันจะมีถ้าเซ็กเมนต์ประเมิน / เปรียบเทียบตัวแปรกับอินพุตสตริงแทนที่จะเป็นจำนวนเต็ม; ต้องการข้อผิดพลาดที่แตกต่างกันเมื่อใช้ "! =" ท่ามกลางสิ่งอื่นที่ฉันลอง

3
การส่งผ่านสองอาร์กิวเมนต์ไปยังคำสั่งโดยใช้ไพพ์
โดยปกติเราจะต้องผ่านการโต้แย้งเพียงครั้งเดียวเท่านั้น: echo abc | cat echo abc | cat some_file - echo abc | cat - some_file มีวิธีการผ่านสองข้อโต้แย้งหรือไม่? สิ่งที่ต้องการ {echo abc , echo xyz} | cat cat `echo abc` `echo xyz` ฉันสามารถเก็บผลลัพธ์ทั้งสองไว้ในไฟล์ก่อนได้ echo abc > file1 echo xyz > file2 cat file1 file2 แต่ฉันอาจเขียนทับไฟล์โดยไม่ตั้งใจซึ่งไม่เป็นไร นี่จะเป็นสคริปต์แบบไม่โต้ตอบ โดยพื้นฐานแล้วฉันต้องการวิธีส่งผลลัพธ์ของคำสั่งสองคำสั่งไปยังcatโดยไม่ต้องเขียนลงไฟล์ อัปเดต: ขออภัยตัวอย่างนี้ปิดบังปัญหา ในขณะที่{ echo …

1
Bash: ส่งอาร์กิวเมนต์ที่เป็นทางเลือกไปยังคำสั่ง
ฉันกำลังพยายามเพิ่มข้อโต้แย้งในการเรียกใช้คำสั่งขึ้นอยู่กับตัวแปรอื่น โปรดดูรหัสเชลล์สคริปต์: curl \ $([ -z "${title}" ] || echo --data-urlencode title=${title}) \ http://example.com ในตัวอย่างถ้าtitleจะได้รับไม่เป็นโมฆะ, curlอาร์กิวเมนต์จะถูกเพิ่มเข้าไป สิ่งนี้ทำงานไม่ถูกต้องหากtitleมีช่องว่าง นอกจากนี้ผมไม่สามารถล้อมรอบ$(...)ด้วยใบเสนอราคาเพราะถ้าเป็นโมฆะก็จะให้ผลผลิตอาร์กิวเมนต์ที่ว่างเปล่าที่ไม่คาดคิดtitlecurl ฉันควรทำอย่างไรเพื่อให้ทำงานได้ตามที่คาดหวัง

4
การเปิดไฟล์ที่เขียนโดยสคริปต์ทำงานนั้นปลอดภัยหรือไม่
ฉันใช้งานเชลล์สคริปต์ที่กำลังเขียนลงไฟล์ สคริปต์นี้อาจใช้เวลานานในการทำให้เสร็จสมบูรณ์และฉันต้องการตรวจสอบผลลัพธ์บางส่วนแทนที่จะรอให้สคริปต์ทำงานเสร็จ จะปลอดภัยไหมที่จะเปิด (ดับเบิลคลิก) ไฟล์ที่เขียนด้วยสคริปต์?

2
การเขียนเชลล์สคริปต์ที่จะทำงานบนเชลล์ใด ๆ (ใช้หลายบรรทัด Shebang?)
ฉันเพิ่งเริ่มเข้าใจเชลล์สคริปต์มากขึ้นและฉันก็แค่โยนสคริปต์ลงในไฟล์ทำเครื่องหมายchmod +xและทำทุกอย่างแล้ว/path/to/script.shให้ล่ามทุกตัวที่เป็นค่าเริ่มต้นมีทางด้วยซึ่งฉันคิดว่าเป็น zsh เพราะนั่นคือสิ่งที่ ฉันใช้เปลือกของฉัน เห็นได้ชัดว่ามันก็ดูเหมือนว่ามันเป็นเพียง/bin/shโดยค่าเริ่มต้นแม้ว่าผมจะรันสคริปต์จาก zsh พรอมต์เพราะผมเริ่มวางสิ่ง zsh zsh /path/to/script.shเฉพาะในสคริปต์ของฉันและมันก็ล้มเหลวถ้าฉันทำงาน เพื่อให้ตรงประเด็นนี่คือคำถามของฉัน: เชลล์ตัวไหนรันสคริปต์เมื่อไม่มีบรรทัด shebang ( #!/path/to/shell) ที่จุดเริ่มต้น? ฉันถือว่า/bin/shแต่ฉันไม่สามารถยืนยันได้ อะไรคือ "แนวทางปฏิบัติที่ดีที่สุด" ในแง่ของการเขียนเชลล์สคริปต์ที่จะทำงานบนแพลตฟอร์มใด ๆ (ตกลงนี่เป็นแบบปลายเปิด) เป็นไปได้ไหมที่จะเขียนสคริปต์ที่พยายามใช้ zsh และกลับไปใช้ทุบตีหาก zsh ไม่พร้อมใช้งาน? ฉันได้ลองใส่ Shebang สองบรรทัดเช่นด้านล่าง แต่มันก็ผิดพลาดbad interpreter: /bin/zsh: no such file or directoryถ้าฉันลองมันบนเครื่องที่ไม่มี zsh #!/bin/zsh #!/bin/bash

2
คำนำหน้าสำหรับแต่ละเอาต์พุตของคำสั่งบนรันไทม์
ฉันกำลังพยายามสร้างสคริปต์แบบแยกส่วน ฉันมีหลายสคริปต์ / คำสั่งที่เรียกจากสคริปต์เดียว ฉันต้องการคำนำหน้าเอาต์พุตของแต่ละคำสั่งแยกกัน Examle: ไฟล์ของฉันคือallcommands.sh / command1.sh / command2.sh command1.shเอาต์พุต file exists file moved command2.shเอาต์พุต file copied file emptied allcommands.shรันสคริปต์command1.shและcommand2.sh ฉันต้องการคำนำหน้าแต่ละเอาต์พุตของสคริปต์ทั้งสองนี้: [command1] file exists [command1] file moved [command2] file copied [command2] file emptied


2
Escape slash ไปข้างหน้าอย่างถูกต้องใน bash script เพื่อใช้กับ sed
ฉันกำลังพยายามกำหนดขนาดของไฟล์ที่จะถูกคัดลอกใหม่เมื่อทำการซิงค์สองโฟลเดอร์โดยการเรียกใช้ rsync ในโหมดแห้งแล้วรวมขนาดของไฟล์ที่แสดงในเอาต์พุตของ rsync ขณะนี้ฉันติดอยู่ที่คำนำหน้าไฟล์โดยโฟลเดอร์แม่ของพวกเขา ฉันค้นพบวิธีนำหน้าบรรทัดโดยใช้ sed และวิธีหลบเลี่ยงการใช้ sed แต่ฉันมีปัญหาในการรวมสองรายการนี้ นี่เป็นวิธีที่ฉันได้รับ: source="/my/source/folder/" target="/my/target/folder/" escaped=`echo "$source" | sed -e 's/[\/&]/\\//g'` du `rsync -ahnv $source $target | tail -n +2 | head -n -3 | sed "s/^/$escaped/"` | awk '{i+=$1} END {print i}' นี่คือผลลัพธ์ที่ฉันได้รับจาก bash -x myscript.sh + source=/my/source/folder/ + target=/my/target/folder ++ …

1
วิธีการเปลี่ยน / เปลี่ยนรหัสผู้ใช้กับสคริปต์ทุบตีเพื่อรันคำสั่งในสคริปต์เดียวกันได้หรือไม่
มีวิธีการเปลี่ยนรหัสประจำตัวผู้ใช้ภายในสคริปต์ (ดำเนินการในฐานะรูทซึ่งเป็นส่วนหนึ่งของกระบวนการติดตั้ง) เพื่อดำเนินการคำสั่งบางอย่างโดยไม่เรียกสคริปต์ภายนอกแล้วกลับrootไปใช้คำสั่งอื่นหรือไม่ เรียงจาก: #!/bin/bash some commands as root SWITCH_USER_TO user some commands as user including environment variables checks, without calling an external script SWITCH_USER_BACK some other stuff as root, maybe another user id change...

5
วิธีตัดไฟล์ด้วยบรรทัด?
ฉันมีไฟล์จำนวนมากบางไฟล์ก็ยาวมาก ฉันอยากจะตัดทอนขนาดที่แน่นอนถ้ามันมีขนาดใหญ่กว่าโดยลบจุดสิ้นสุดของไฟล์ แต่ฉันต้องการลบทั้งบรรทัด ฉันจะทำสิ่งนี้ได้อย่างไร รู้สึกเหมือนเป็นสิ่งที่จัดการโดย Linux toolchain แต่ฉันไม่รู้คำสั่งที่ถูกต้อง ตัวอย่างเช่นสมมติว่าฉันมีไฟล์ 120,000 ไบต์พร้อมเส้น 300- ไบต์และฉันพยายามตัดให้เหลือ 10,000 ไบต์ 33 บรรทัดแรกควรอยู่ (9900 ไบต์) และตัดส่วนที่เหลือออก ฉันไม่ต้องการตัดที่ 10,000 ไบต์อย่างแน่นอนเพราะจะทำให้มีบางส่วน แน่นอนว่าไฟล์มีความยาวต่างกันและเส้นไม่ได้มีความยาวเท่ากันทั้งหมด ตามหลักแล้วไฟล์ผลลัพธ์จะสั้นลงเล็กน้อยแทนที่จะยาวขึ้นอีกเล็กน้อย (หากเบรกพอยต์อยู่บนเส้นยาว) แต่นั่นไม่สำคัญเกินไป ฉันต้องการให้การเปลี่ยนแปลงกับไฟล์โดยตรง (อาจเป็นไฟล์ใหม่ที่คัดลอกไปที่อื่นไฟล์ต้นฉบับถูกลบและไฟล์ใหม่ถูกย้าย แต่นั่นก็เป็นสิ่งเดียวกันจาก POV ของผู้ใช้) วิธีการแก้ปัญหาที่เปลี่ยนเส้นทางข้อมูลไปยังสถานที่มากมายแล้วกลับมาเชิญชวนความเป็นไปได้ของการทำลายไฟล์และฉันต้องการหลีกเลี่ยง ...

2
ทุบตี bash สำหรับรูปแบบชื่อไฟล์หรือไดเรกทอรี
ฉันกำลังพยายามสร้างสคริปต์การทุบตีเสร็จสิ้นและมีปัญหา ฉันต้องการตั้งค่าเพื่อให้รายการที่สมบูรณ์เป็นไฟล์ที่ตรงกับส่วนขยายหรือไดเรกทอรี (ซึ่งอาจมีหรือไม่มีไฟล์ของส่วนขยายนั้น) ปัญหาที่ฉันมีคือวิธีเดียวที่ฉันจะได้รับความสำเร็จในการเก็บไฟล์และไดเรกทอรีคือการใช้สิ่งที่ชอบ-o plusdirs -f -X '!*.txt'แต่เมื่อฉันปล่อยทุบตีหนึ่งในไดเรกทอรีที่สมบูรณ์มันเพิ่งเพิ่มช่องว่างไปยังจุดสิ้นสุดมากกว่า เฉือน _xyz() { local cur=${COMP_WORDS[COMP_CWORD]} local prev=${COMP_WORDS[COMP_CWORD-1]} #COMPREPLY=( $( compgen -f -X '!*.txt' -- $cur ) ) #COMPREPLY=( $( compgen -f -G '*.txt' -- $cur ) ) #COMPREPLY=( $( compgen -o filenames -f -X '!*.txt' -- $cur ) ) #COMPREPLY=( $( compgen …

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