ทุบตี เป็นโปรแกรมคอมพิวเตอร์ที่มีหน้าที่แปลคำสั่ง มันขึ้นอยู่กับเปลือกของ ยูนิกซ์ และถูกเขียนขึ้นสำหรับโครงการ GNU เป็นเชลล์ดีฟอลต์ในการแจกแจงส่วนใหญ่ของ GNU / Linux. ชื่อของเขาเป็นคำย่อของ บอร์น-อะเกน เชลล์ (อีกเปลือกหนึ่ง)การเล่นคำ (เกิดอีกครั้งหมายถึงการเกิดใหม่) เกี่ยวกับ เปลือกบอร์น (sh)ซึ่งเป็นหนึ่งในล่ามหลักคนแรกของ Unix
วันนี้เราจะแสดงเชลล์สคริปต์ที่มีประโยชน์มากสำหรับนักพัฒนา ส่วนใหญ่ทำงานในเปลือกใด ๆ ยูนิกซ์แม้ว่าบางคนต้องการให้ดำเนินการโดยเฉพาะ ทุบตี.
ป้องกันไม่ให้ผู้ใช้ที่ไม่ได้รับสิทธิพิเศษเรียกใช้สคริปต์
สคริปต์บางตัวดำเนินงานการดูแลระบบดังนั้นเราอาจต้องการให้เฉพาะผู้ใช้ root เท่านั้นที่รันสคริปต์ ในกรณีนี้เราสามารถใช้สิ่งนี้:
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "Este script debe ser ejecutado por el usuario root" 1>&2
exit 1
fi
อนุญาตให้เรียกใช้สคริปต์กับผู้ใช้ที่ระบุเท่านั้น
เช่นเดียวกับโค้ดด้านบนเราอาจต้องการให้เฉพาะผู้ใช้ที่ต้องการรันสคริปต์ เราทำเช่นนั้น:
#!/bin/bash
AUTHORIZED_USER="usuario_permitido"
if [ $USER != $AUTHORIZED_USER ]; then
echo "Este script debe ser ejecutado por el usuario $AUTHORIZED_USER" 1>&2
exit 1
fi
ตรวจสอบว่าบริการ / กระบวนการทำงานอยู่
หากเราต้องการทราบว่ามีกระบวนการของบริการหรือโปรแกรมใด ๆ ที่ทำงานอยู่หรือไม่เราสามารถใช้สคริปต์นี้ได้ (ในกรณีนี้เป็นการตรวจสอบว่าปีศาจของ อาปาเช่ กำลังวิ่ง):
#!/bin/sh
SERVICE='httpd'
if ps ax | grep -v grep | grep $SERVICE > /dev/null
then
echo "El servicio $SERVICE esta ejecutandose"
else
echo "Chanfle! El servicio $SERVICE esta detenido"
fi
สร้างไฟล์ล็อค
บางครั้งเราต้องแน่ใจว่าสคริปต์ไม่ได้ทำงานสองครั้งขึ้นไปพร้อมกัน สำหรับสิ่งนี้เราสามารถใช้ประโยชน์จากไฟล์ล็อค นี่เป็นสคริปต์เวอร์ชันง่ายๆที่ให้เราทำสิ่งนี้:
#!/bin/bash
lockfile=/var/lock/loquesea.lock
if [ ! -e $lockfile ]; then
touch $lockfile
echo "hago muchas cosas importantes aqui"
rm $lockfile
else
echo "ya hay otro proceso corriendo"
fi
ในกรณีนี้จะได้รับการตรวจสอบว่าไฟล์ what.lock มีอยู่ ในกรณีที่มีอยู่สคริปต์จะไม่ดำเนินการตามภารกิจ หากไม่มีอยู่ระบบจะสร้างไฟล์เรียกใช้งานที่ต้องรันและลบออก แต่ไม่น่าเชื่อถือทั้งหมด จะเกิดอะไรขึ้นถ้าในขณะที่สคริปต์ของเรากำลังทำงานอยู่มันถูกปิดทันที
ในกรณีนี้ไฟล์ล็อกจะไม่ถูกลบดังนั้นจึงไม่อนุญาตให้เราเรียกใช้สคริปต์อีกครั้ง เพื่อให้ครอบคลุมกรณีเหล่านั้นเราสามารถใช้ประโยชน์จากคำสั่งกับดักที่ช่วยให้เราดำเนินการคำสั่งในกรณีที่สคริปต์ของเราจบลงโดยไม่คาดคิด นี่เป็นเวอร์ชันขั้นสูงกว่าที่บันทึก PID ของสคริปต์ที่เรียกใช้งานภายในไฟล์ล็อก:
#!/bin/bash
lockfile=/var/lock/loquesea.lock
if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;
then
trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
echo "hago muchas cosas aqui tranquilamente"
rm -f "$lockfile"
trap - INT TERM EXIT
else
echo "Ya hay otro proceso de este script ejecutandose"
echo "corriendo con el PID: $(cat $lockfile)"
fi
มาทำความเข้าใจคำสั่งกันหน่อยดีกว่า กับดัก. โดยพื้นฐานแล้วไวยากรณ์ของมันคือ: สัญญาณคำสั่งกับดัก [สัญญาณ ... ]; โดยที่สัญญาณคือสัญญาณบอกเลิกที่คุณต้องการจับ หากคุณต้องการดูรายการสัญญาณที่มีคุณสามารถรันคำสั่ง kill -l สำหรับกรณีก่อนหน้านี้ใช้สัญญาณ INT (จับการสิ้นสุดที่สร้างโดย Ctrl + c), ระยะเวลา (การยุติผลิตโดยคำสั่ง kill) และออก (การยุติสคริปต์ตามปกติไม่ว่าจะเป็นเพราะไม่มีบรรทัดให้ดำเนินการอีกต่อไปหรือเพราะเจอคำสั่ง exit).
เมนูตัวเลือก
ในการสร้างเมนูที่เราอนุญาตให้ผู้ใช้เลือกชุดตัวเลือกเราสามารถใช้โครงร่างต่อไปนี้:
#!/bin/bash
clear
while :
do
echo " Escoja una opcion "
echo "1. quien soy?"
echo "2. cuanto espacio tengo"
echo "3. que es esto?"
echo "4. Salir"
echo -n "Seleccione una opcion [1 - 4]"
read opcion
case $opcion in
1) echo "este eres:";
whoami;;
2) echo "tienes esto";
df;;
3) uname -r;;
4) echo "chao";
exit 1;;
*) echo "$opc es una opcion invalida. Es tan dificil?";
echo "Presiona una tecla para continuar...";
read foo;;
esac
done
ขอการยืนยันก่อนเรียกใช้สคริปต์
บางครั้งการให้ผู้ใช้ยืนยันการดำเนินการของชุดคำสั่งนั่นคือข้อความทั่วไปที่ขอให้ผู้ใช้พิมพ์ yes or no เราสามารถทำได้ดังนี้:
#!/bin/bash
while true; do
echo
read -p "esta seguro de hacer lo que sea que vaya a hacer " yn
case $yn in
yes ) break;;
no ) exit;;
* ) echo "por favor responda yes o no";;
esac
done
echo "si se ejecuta esto es que aceptaste"
สิ้นสุดบทความ ยอดเยี่ยมเพียง😀
แก้ไข: คุณต้องระมัดระวังกับการเว้นวรรคและแท็บซึ่งด้วยเหตุผลบางประการจึงไม่ออกมา¬¬
ไอ้พวกมันเยี่ยมมาก O_O ... มันจะช่วยได้มากกับสิ่งเล็ก ๆ น้อย ๆ ของฉันที่ฉันทำใน Bash 😀
สคริปต์ยอดเยี่ยมมาก! ช่างเป็นสิ่งที่มีส่วนช่วยอย่างมากในสิ่งที่ฉันกำลังมองหา
PS: ฟอรั่มไม่ทำงาน
ใช่เซิร์ฟเวอร์ที่ติดตั้งฟอรัมนั้นออฟไลน์ไม่รู้ว่าทำไม ... เราจึงเขียนอีเมลไปหาเพื่อนที่ดูแลเรื่องนั้นเพื่อดูว่าเขาตอบกลับเราอย่างไร🙂
อาศิรพจน์
อืมหวังว่ามันจะไม่มีอะไรร้ายแรง
"แกลบ" นั้นรวมอยู่ใน Code Ninja ด้วยหรือไม่? XD
ฉันชอบพลังของ bash 😉และพวกเขาก็บอกฉันว่าภาษา C มีไว้เพื่ออะไร ... ในเชลล์สคริปต์มีคำสั่งที่คุ้นเคยมากมาย
ขอบคุณฉันชอบมาก
การตรวจสอบความถูกต้องของพารามิเตอร์อินพุตมีประโยชน์มาก ฉันไม่รู้วิธีทำเมนู =)
เยี่ยมมาก…. ตอนนี้ฉันสามารถให้ "ความแข็ง" บางอย่างกับ churros สคริปต์ของฉันฮ่า ๆ
มีความยินดีเป็นอย่างยิ่งที่ได้เห็นว่าการทำงานที่ต่ำต้อยของเราที่ CodeNinja ให้บริการชุมชน linux ระหว่างประเทศอย่างไร
ชัดเจน! 🙂
ทุกอย่างคือการช่วยเหลือและมีส่วนร่วมกันไม่ใช่เพื่อก่อไฟใช่ไหม? 😉
สคริปต์กระบวนการที่กำลังทำงานอยู่สามารถปรับปรุงได้เล็กน้อยโดยใส่ตัวเลือกเพื่อเลือกกระบวนการที่คุณต้องการทราบซึ่งจะมีลักษณะดังนี้:
#! / bin / ทุบตี
echo "เลือกบริการ"
อ่าน SERVICE
# บริการ = 'mysql'
ถ้า ps ขวาน | grep -v grep | grep $ SERVICE> / dev / null
แล้วก็
สะท้อน "บริการ $ SERVICE กำลังทำงาน"
อื่น
เสียงสะท้อน "บริการ $ SERVICE หยุดทำงาน"
ฉันมีสคริปต์ที่ใช้งานได้จริง แต่ฉันกำลังมองหาสคริปต์พิเศษเพื่อแก้ปัญหาที่ฉันมีซึ่งมีดังต่อไปนี้: เรามีแอปพลิเคชันเซิร์ฟเวอร์ใน บริษัท ที่ผู้ใช้ภายในเข้าถึงได้โดยเทลเน็ตและเรียกใช้แอปพลิเคชันพิเศษที่เป็น จำกัด สำหรับใบอนุญาตผู้ใช้จะละเมิดและเปิดมากกว่าหนึ่งเทลเน็ตเพื่อรับสิทธิ์การใช้งานมากกว่า 2 รายการดังนั้นสคริปต์ที่ฉันคิดไว้ก็คือโดยวิธีการบางอย่างให้ตรวจสอบว่ากระบวนการ telnet ใดไม่ได้ใช้งานนานกว่า 2 ชั่วโมงจึงส่ง kill pid คุณช่วยฉันได้ไหม
ติดตั้งโปรแกรมต่อไปนี้
ความถนัดในการติดตั้ง autolog
และไฟล์การกำหนดค่าที่คุณมีใน /etc/autolog.conf
เยี่ยมมากเพื่อนฉันสามารถถามคำถามคุณได้ฉันต้องการเชลล์สคริปต์ที่มีตัวเลือกและฉันได้อิงตามของคุณและมันก็ใช้งานได้ดี แต่หนึ่งในตัวเลือกต้องส่งอีเมล (โดยใช้ postifix) มันจะถามเรื่อง, ข้อความ และผู้รับบนหน้าจอและสิ่งที่ส่งและตรวจสอบว่าส่งถูกต้องด้วย mailq ฉันสามารถดูคิวและดูว่ามีการส่งหรือไม่ แต่ฉันจะส่งอีเมลตามคำสั่งได้อย่างไรโดยใช้ตัวแปรที่รับเรื่องข้อความและผู้รับ เหรอ? 🙁
เขียนถึงอีเมลของฉัน (kzkggaara[at]desdelinux[dot]net) เพื่อพูดอย่างใจเย็นมากขึ้น ฉันยินดีที่จะช่วยเหลือคุณ :)
ขอบคุณมากเพื่อนคุณผ่าน!
สวัสดีดี.
ฉันเจอตัวอย่างที่ยอดเยี่ยมเหล่านี้เมื่อฉันต้องการเมนู
ฉันเริ่มทำแล้วและไม่สามารถใช้งานได้ (ในขั้นตอนก่อนหน้านี้)
ฉันมีองค์ประกอบ 247 รายการซึ่งอ้างถึงโดเมนอาณาเขตที่แตกต่างกัน
สิ่งที่ฉันต้องการคือเมนูสำหรับเลือกประเทศ:
#! / bin / ทุบตี
ชัดเจน
ในขณะที่:
do
echo »เลือกประเทศที่จะลอง»
เสียงสะท้อน« 1. อัฟกานิสถาน (AF) »
เสียงสะท้อน« 2. แอลเบเนีย (AL) »
เสียงสะท้อน« 3. เยอรมนี (DE) »
เสียงสะท้อน« 5. แองโกลา (AO) »
เสียงสะท้อน« 6. แองกวิลลา (AI) »
.. และเรื่อยไปจนถึง 247
echo -n "เลือกตัวเลือก [1 - 247]"
อ่านตัวเลือก
case $ option ใน
1) สะท้อน "นี่คือคุณ:"; whoami ;;
2) ก้อง "คุณมีสิ่งนี้"; df ;;
3) เสียงสะท้อน ""; ไม่มีชื่อ -r ;;
4) echo "ลาก่อน"; ทางออก 1 ;;
5) สะท้อน "นี่คือคุณ:"; whoami ;;
6) สะท้อน "นี่คือคุณ:"; whoami ;;
…และดำเนินต่อไปจนถึง 247
*) echo « $ opc เป็นตัวเลือกที่ไม่ถูกต้อง มันยากขนาดนี้? ";
echo "กดปุ่มเพื่อดำเนินการต่อ ... ";
อ่าน foo ;;
ว่า C
ทำ
ลักษณะการทำงานมีดังนี้:
ตัวเลือกใด ๆ ยกเว้น 4 ซึ่งเป็นเอาต์พุตจะลบหมายเลขที่ป้อนและรอหมายเลขใหม่
เข้า 4 ออกมา
ถ้าฉันใส่รหัสของ 4 ในบรรทัดอื่น ๆ (สมมติว่า 150) มันออกมาเท่า ๆ กันโดยไม่มีปัญหา
ฉันได้พยายามใส่รหัสในรูปแบบนี้ด้วย:
151) สะท้อนว่า "นี่คือคุณ:";
ฉันเป็นใคร ;;
ด้วยผลลัพธ์เดียวกัน
ฉันสงสัยว่ามีตัวเลือกที่ดีกว่าสำหรับเมนูยาว ๆ แบบนี้หรือเปล่าและแน่นอนว่าฉันทำผิดด้วย
ความช่วยเหลือจะได้รับการชื่นชมมากขอบคุณ
เยี่ยมมาก ... คิดว่าเข้ากะลาได้ดีมาก
ขอบคุณ
เยี่ยมมากเฮ้ฉันจะทำให้ bash ทำงานกับไฟล์ได้อย่างไร
ตัวอย่างเช่น:
อัพโหลด.sh fotodelavecina.jpg
คิดว่าสคริปต์ทุบตีของฉัน "upload.sh" มีข้อมูลการเข้าถึง ftp ของฉัน
ทักทายและขอบคุณ😀
คนดีขอบคุณมากสำหรับสคริปต์ทั้งหมดฉันได้ตั้งค่าเซิร์ฟเวอร์ CentOS แล้วและคุณไม่รู้ว่าเทมเพลตเหล่านี้มาหาฉันได้ดีแค่ไหนโปรดติดต่อฉันทางอีเมล ฉันต้องการเสนอบางอย่างให้กับคุณ
ทำไมคุณถึงใช้ read foo เมื่อสร้างเมนู? คำตอบด่วนที่ฉันต้องการ