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

สำหรับคำถามเกี่ยวกับสคริปต์ที่เขียนขึ้นสำหรับเชลล์คำสั่ง Bash สำหรับเชลล์สคริปต์ที่มีข้อผิดพลาด / ข้อผิดพลาดทางไวยากรณ์โปรดตรวจสอบด้วยโปรแกรม shellcheck (หรือในเซิร์ฟเวอร์ shellcheck เว็บที่ https://shellcheck.net) ก่อนโพสต์ที่นี่ คำถามเกี่ยวกับการใช้งานอินเทอร์แอคทีฟของ Bash นั้นมีแนวโน้มที่จะอยู่ในหัวข้อของผู้ใช้ขั้นสูงมากกว่าในสแต็คโอเวอร์โฟลว์

7
จะส่งอีเมล์จาก Terminal ได้อย่างไร?
ฉันรู้ว่ามีวิธีการส่งอีเมลจากเทอร์มินัลใน Linux / MacOS แต่ฉันไม่สามารถหาเอกสารที่เหมาะสมเกี่ยวกับวิธีการทำเช่นนั้นได้ โดยทั่วไปฉันต้องการมันสำหรับสคริปต์ทุบตีของฉันที่แจ้งฉันทุกครั้งที่มีการเปลี่ยนแปลงในไฟล์
169 bash  email  terminal 

8
ฉันจะเรียกใช้คำสั่งพื้นหลังหลายคำในทุบตีในบรรทัดเดียวได้อย่างไร
ปกติฉันจะใช้คำสั่งหลาย ๆ อย่างเช่น: sleep 2 && sleep 3 หรือ sleep 2 ; sleep 3 แต่ถ้าฉันต้องการเรียกใช้ทั้งสองในพื้นหลังจากคำสั่งบรรทัดคำสั่งเดียว? sleep 2 & && sleep 3 & ไม่ทำงาน และไม่แทนที่&&ด้วย; มีวิธีทำหรือไม่?
169 linux  bash  shell 

4
การเรียกฟังก์ชันเชลล์ด้วย xargs
ฉันพยายามใช้ xargs เพื่อเรียกใช้ฟังก์ชันที่ซับซ้อนมากขึ้นในแบบคู่ขนาน #!/bin/bash echo_var(){ echo $1 return 0 } seq -f "n%04g" 1 100 |xargs -n 1 -P 10 -i echo_var {} exit 0 ส่งคืนข้อผิดพลาด xargs: echo_var: No such file or directory ความคิดใด ๆ เกี่ยวกับวิธีที่ฉันสามารถใช้ xargs เพื่อทำให้สิ่งนี้สำเร็จมิเช่นนั้นจะยินดีต้อนรับทางออกอื่น ๆ
168 bash  sh  xargs 

9
วิธีการวนซ้ำไดเรกทอรีใน Linux?
ฉันกำลังเขียนสคริปต์ใน bash บน Linux และต้องผ่านชื่อไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีที่กำหนด ฉันจะวนซ้ำไดเรกทอรีเหล่านี้ (และข้ามไฟล์ปกติ) ได้อย่างไร ตัวอย่างเช่น: ไดเรกทอรีที่กำหนดคือ/tmp/ มันมีไดเรกทอรีย่อยดังต่อไปนี้:/tmp/A, /tmp/B, /tmp/C ฉันต้องการดึง A, B, C
168 linux  bash 

4
วิธีการใช้ตัวดำเนินการ mod ในทุบตี?
ฉันกำลังลองบรรทัดดังนี้: for i in {1..600}; do wget http://example.com/search/link $i % 5; done; สิ่งที่ฉันพยายามทำให้ได้ผลลัพธ์คือ: wget http://example.com/search/link0 wget http://example.com/search/link1 wget http://example.com/search/link2 wget http://example.com/search/link3 wget http://example.com/search/link4 wget http://example.com/search/link0 แต่สิ่งที่ฉันได้รับจริง ๆ ก็คือ: wget http://example.com/search/link

4
ตัวดำเนินการ“ และ” สำหรับคำสั่ง“ if” ใน Bash
ฉันกำลังพยายามสร้างสคริปต์ Bash แบบง่าย ๆ เพื่อตรวจสอบว่าเว็บไซต์ดังกล่าวขัดข้องและด้วยเหตุผลบางอย่าง "และ" โอเปอเรเตอร์ไม่ทำงาน: #!/usr/bin/env bash WEBSITE=domain.com SUBJECT="$WEBSITE DOWN!" EMAILID="an@email.com" STATUS=$(curl -sI $WEBSITE | awk '/HTTP\/1.1/ { print $2 }') STRING=$(curl -s $WEBSITE | grep -o "string_to_search") VALUE="string_to_search" if [ $STATUS -ne 200 ] && [[ "$STRING" != "$VALUE" ]]; then echo "Website: $WEBSITE is down, status …
168 bash  if-statement 

9
รูปแบบการออกแบบหรือแนวปฏิบัติที่ดีที่สุดสำหรับเชลล์สคริปต์ [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา ไม่มีใครรู้เกี่ยวกับทรัพยากรใด ๆ ที่พูดถึงแนวปฏิบัติที่ดีที่สุดหรือรูปแบบการออกแบบสำหรับเชลล์สคริปต์ (sh, bash เป็นต้น)

6
ฉันจะจับคู่สตริงกับ regex ใน Bash ได้อย่างไร
ฉันพยายามที่จะเขียนสคริปต์ทุบตีที่มีฟังก์ชั่นดังนั้นเมื่อได้รับ.tar, .tar.bz2, .tar.gzไฟล์อื่น ๆ จะใช้ tar กับสวิทช์ที่เกี่ยวข้องเพื่อขยายไฟล์ ฉันใช้ถ้า elif แล้วข้อความที่ทดสอบชื่อไฟล์เพื่อดูว่ามันลงท้ายด้วยและฉันไม่สามารถให้ตรงกับ metacharacters regex หากต้องการบันทึกการเขียนสคริปต์ใหม่อย่างต่อเนื่องที่ฉันใช้ 'ทดสอบ' ที่บรรทัดคำสั่งฉันคิดว่าคำสั่งด้านล่างควรใช้งานได้ฉันได้ลองใช้ชุดวงเล็บเครื่องหมายคำพูดและ metacharaters ทุกอย่างที่เป็นไปได้ แต่ก็ยังล้มเหลว test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $? (this returns 1, false) ฉันแน่ใจว่าปัญหาเป็นเรื่องง่ายและฉันได้ดูทุกที่ แต่ฉันไม่สามารถเข้าใจได้ว่าจะทำอย่างไร มีใครรู้บ้างว่าฉันจะทำสิ่งนี้ได้อย่างไร
166 regex  string  bash 

10
คำสั่ง eval ใน Bash และการใช้งานทั่วไป
หลังจากอ่านหน้าคนทุบตีและเกี่ยวกับการโพสต์นี้ ฉันยังคงมีปัญหาในการเข้าใจสิ่งที่evalคำสั่งทำและสิ่งที่จะเป็นประโยชน์โดยทั่วไป ตัวอย่างเช่นถ้าเราทำ: bash$ set -- one two three # sets $1 $2 $3 bash$ echo $1 one bash$ n=1 bash$ echo ${$n} ## First attempt to echo $1 using brackets fails bash: ${$n}: bad substitution bash$ echo $($n) ## Second attempt to echo $1 using parentheses fails bash: 1: …
166 linux  bash  shell  scripting  eval 

8
bash: วิธีที่สั้นที่สุดในการรับคอลัมน์ที่ n ของผลลัพธ์
สมมติว่าในระหว่างวันทำงานของคุณคุณจะพบรูปแบบต่อไปนี้ของเอาต์พุตคอลัมน์จากคำสั่งบางคำใน bash (ในกรณีของฉันจากการดำเนินการsvn stในไดเรกทอรีทำงาน Rails ของฉัน): ? changes.patch M app/models/superman.rb A app/models/superwoman.rb เพื่อทำงานกับเอาต์พุตของคำสั่งของคุณ - ในกรณีนี้ชื่อไฟล์ - จำเป็นต้องมีการแยกวิเคราะห์บางอย่างเพื่อให้คอลัมน์ที่สองสามารถใช้เป็นอินพุตสำหรับคำสั่งถัดไป สิ่งที่ฉันได้ทำคือการใช้awkเพื่อรับที่คอลัมน์ที่สองเช่นเมื่อฉันต้องการลบไฟล์ทั้งหมด (ไม่ใช่ว่าเป็น usecase ทั่วไป :) ฉันจะทำ: svn st | awk '{print $2}' | xargs rm เนื่องจากฉันพิมพ์สิ่งนี้บ่อยๆคำถามธรรมชาติคือ: มีวิธีที่สั้นกว่า หมายเหตุ: สิ่งที่ฉันถามเป็นหลักเป็นคำถามคำสั่งเชลล์แม้ว่าตัวอย่างที่เป็นรูปธรรมของฉันอยู่ในเวิร์กโฟลว์ svn ของฉัน หากคุณรู้สึกว่าเวิร์กโฟลว์นั้นโง่และแนะนำวิธีการอื่นฉันอาจไม่ลงคะแนนให้คุณ แต่คนอื่น ๆ อาจเนื่องจากคำถามที่นี่เป็นวิธีการรับเอาต์พุตคอลัมน์คำสั่ง n-th ใน bash อย่างสั้นที่สุดเท่าที่จะทำได้ . ขอบคุณ :)
166 bash  awk 

2
กำหนดเอาต์พุตให้กับตัวแปรใน Bash
ฉันพยายามกำหนดผลลัพธ์ของ cURL ให้เป็นตัวแปรดังนี้: #!/bin/sh $IP=`curl automation.whatismyip.com/n09230945.asp` echo $IP sed s/IP/$IP/ nsupdate.txt | nsupdate อย่างไรก็ตามเมื่อฉันรันสคริปต์สิ่งต่อไปนี้จะเกิดขึ้น: ./update.sh: 3: =[my ip address]: not found ฉันจะเอาท์พุทให้$IPถูกต้องได้อย่างไร?
166 bash  curl 


5
ฉันจะทำให้ไฟล์นี้ปฏิบัติการได้อย่างไรผ่านการดับเบิลคลิก?
ก่อนอื่นฉันใช้ Mac ต่อไปฉันต้องเรียกใช้งาน "file.sh" นี้เราจะเรียกมันว่า ทุกครั้งที่ฉันต้องเรียกใช้งานฉันต้องเปิด Terminal และพิมพ์: cd /Users/Jacob/Documents/folderWithFileInIt bash file.sh ไม่เป็นไร แต่ฉันรู้สึกว่ามันจะเร็วกว่านี้ถ้าฉันทำให้ไฟล์ทำงานด้วยการดับเบิลคลิกคุณไม่คิดเหรอ? ดังนั้นคำถามของฉันคือฉันจะทำให้ไฟล์นี้ทำงานด้วยการดับเบิลคลิกได้อย่างไร ความคิดของฉันคือ: a) พิมพ์ chmod ลงในเทอร์มินัลแล้วเปลี่ยนการอนุญาต b) ทำไฟล์ใส่โค้ดที่ฉันเขียนไว้ด้านบน ^ แล้วทำให้ไฟล์นั้นทำงานได้หรือไม่ c) สร้างระบบอัตโนมัติเพื่อทำสิ่งนี้? วิธีไหนดีที่สุดหรือมีวิธีที่ดีกว่า โปรดอธิบายให้มากที่สุดเท่าที่คุณสามารถทำได้ฉันยังใหม่กับเทอร์มินัล ขอบคุณ

7
การแสดงความคิดเห็นในสคริปต์ Bash ภายในคำสั่งหลายบรรทัด
ฉันจะแสดงความคิดเห็นในแต่ละบรรทัดของบรรทัดต่อไปนี้จากสคริปต์ได้อย่างไร cat ${MYSQLDUMP} | \ sed '1d' | \ tr ",;" "\n" | \ sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' | \ sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' | \ sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' | \ tr "\n" "," | \ sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' …
165 bash  syntax  comments 

4
ทุบตีถ้าคำสั่งที่มีหลายเงื่อนไขพ่นข้อผิดพลาด
ฉันพยายามเขียนสคริปต์ที่จะตรวจสอบสถานะข้อผิดพลาดสองรายการและในกรณีที่มีการเปลี่ยนแปลงสถานะหนึ่ง (หรือทั้งสองอย่าง) มันจะเกิดข้อผิดพลาดขึ้น สคริปต์ของฉัน: my_error_flag=0 my_error_flag_o=0 do something..... if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then echo "$my_error_flag" else echo "no flag" fi โดยพื้นฐานแล้วควรมีบางสิ่งพร้อม: if ((a=1 or b=2) or (a=1 and b=2)) then display error else no error fi ข้อผิดพลาดที่ฉันได้รับคือ: line 26: conditional binary operator …
165 bash  if-statement  flags 

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