Skrip shell berguna dalam mana-mana program

Bash Ini adalah program komputer yang fungsinya adalah untuk mentafsirkan pesanan. Ia berdasarkan cengkerang Unix dan ditulis untuk projek itu GNU menjadi shell lalai dalam sebilangan besar pengedaran GNU / Linux. Namanya adalah singkatan dari Bourne-Again Shell (cengkerang lain), mempermainkan kata-kata (dilahirkan semula bermaksud kelahiran semula) pada Cangkang Bourne (sh), yang merupakan salah satu penafsir utama Unix pertama.

Hari ini kita akan menunjukkan beberapa skrip shell yang sangat berguna untuk pembangun. Sebilangan besar bekerja di cangkang mana pun Unix, walaupun ada yang mengharuskan mereka dilaksanakan secara khusus oleh Bash.

Cegah pengguna yang tidak berhak menjalankan skrip

Beberapa skrip menjalankan tugas pentadbiran, jadi kami mungkin hanya mahu pengguna root menjalankan skrip. Sekiranya kita dapat menggunakan sesuatu seperti ini:

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "Este script debe ser ejecutado por el usuario root" 1>&2
exit 1
fi

Benarkan pelaksanaan skrip hanya untuk pengguna tertentu

Sama seperti kod di atas, kami mungkin hanya mahu pengguna tertentu menjalankan skrip. Kami melakukannya:

#!/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

Sahkan bahawa perkhidmatan / proses sedang berjalan

Sekiranya kita ingin mengetahui apakah ada proses perkhidmatan atau program yang berjalan, kita dapat menggunakan skrip ini (dalam kes ini ia mengesahkan bahawa iblis dari Apache adalah berlari):

#!/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

Buat fail kunci

Kadang-kadang kita harus memastikan bahawa skrip tidak berjalan dua atau lebih kali secara serentak. Untuk ini kita boleh menggunakan fail kunci. Ini adalah versi skrip ringkas yang membolehkan kami melakukan ini:

#!/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

Dalam kes ini, disahkan bahawa fail tersebut apa sahaja.kunci ada. Sekiranya ada, skrip TIDAK menjalankan tugasnya. Sekiranya tidak ada, ia akan membuat fail, menjalankan tugas yang perlu dijalankan, dan menghapusnya. Tetapi, ini tidak boleh dipercayai sepenuhnya. Apa yang akan berlaku sekiranya semasa skrip kami berjalan ia ditutup secara tiba-tiba?

Sekiranya fail kunci tidak akan dihapus, dan oleh itu ia tidak membenarkan kita menjalankan skrip lagi. Untuk menutup kes-kes tersebut, kita dapat memanfaatkan perintah perangkap yang memungkinkan kita untuk melaksanakan perintah sekiranya skrip kita berakhir tanpa diduga. Ini adalah versi yang lebih maju yang juga menyimpan PID skrip yang melaksanakannya dalam fail kunci:

#!/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

Mari kita memahami arahannya sedikit lebih baik perangkap. Sintaksnya pada dasarnya adalah: perangkap arahan arahan [signal…]; di mana isyarat adalah isyarat penamatan yang ingin anda tangkap. Sekiranya anda ingin melihat senarai isyarat yang ada, anda boleh menjalankan perintah kill -l. Untuk kes sebelumnya, isyarat INT telah digunakan (menangkap penamatan yang dihasilkan oleh Ctrl + c), JANGKA MASA (penamatan yang dihasilkan oleh perintah kill) dan KELUAR (Penghentian skrip normal, baik kerana tidak ada lagi baris yang harus dilaksanakan atau karena terdapat perintah keluar).

Menu pilihan

Untuk membuat menu di mana kita membenarkan pengguna memilih rangkaian pilihan, kita boleh menggunakan skema berikut:

#!/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

Minta pengesahan sebelum menjalankan skrip

Kadang-kadang berguna untuk pengguna mengesahkan pelaksanaan sekumpulan pernyataan, iaitu, pesan khas yang meminta pengguna untuk mengetik ya atau tidak. Kita boleh melakukannya seperti ini:

#!/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"

Akhir artikel. Cukup hebat 😀

Edit: Anda harus berhati-hati dengan ruang dan tab, yang untuk beberapa sebab tidak keluar ¬¬


Kandungan artikel mematuhi prinsip kami etika editorial. Untuk melaporkan ralat, klik di sini.

22 komen, tinggalkan komen anda

Tinggalkan komen anda

Alamat email anda tidak akan disiarkan. Ruangan yang diperlukan ditanda dengan *

*

*

  1. Bertanggungjawab atas data: Miguel Ángel Gatón
  2. Tujuan data: Mengendalikan SPAM, pengurusan komen.
  3. Perundangan: Persetujuan anda
  4. Komunikasi data: Data tidak akan disampaikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Pangkalan data yang dihoskan oleh Occentus Networks (EU)
  6. Hak: Pada bila-bila masa anda boleh menghadkan, memulihkan dan menghapus maklumat anda.

  1.   KZKG ^ Gaara kata

    Persetan dengan mereka hebat O_O ... ini akan banyak membantu perkara kecil yang saya lakukan di Bash 😀

  2.   ren434 kata

    Skripnya sangat hebat! Sungguh besar sumbangannya, hanya yang saya cari.

    PS: Forum tergendala.

    1.    KZKG ^ Gaara kata

      Ya, pelayan tempat forum dipasang di luar talian, tidak tahu mengapa ... kami menulis e-mel kepada rakan yang mengurusnya, untuk melihat apa yang dia balas kepada kami 🙂

      Greetings.

  3.   ren434 kata

    Oh, mari kita berharap ia tidak serius.

  4.   kidal kata

    Adakah "sekam" itu juga termasuk dalam Code Ninja? XD

  5.   taregon kata

    Saya suka kekuatan bash 😉 dan mereka memberitahu saya untuk apa bahasa C itu ... baik, dalam skrip shell terdapat banyak perintah yang biasa.

  6.   Christopher kata

    Terima kasih, saya sangat suka

  7.   bilah malaikat kata

    Pengesahan parameter input sangat berguna. Saya tidak tahu bagaimana membuat menu =)

  8.   Hyuuga_Neji kata

    Hebat…. sekarang saya dapat memberikan "kekerasan" pada naskah saya churros ha

  9.   raven kata

    Senang melihat bagaimana kerja rendah hati kami di CodeNinja melayani komuniti linux antarabangsa

    1.    KZKG ^ Gaara kata

      Jelas! 🙂
      Semuanya adalah untuk menolong dan menyumbang bersama, dan bukan untuk membuat api, bukan? 😉

  10.   diego kata

    Skrip proses yang sedang berjalan dapat diperbaiki sedikit dengan meletakkan pilihan untuk memilih proses yang ingin Anda ketahui, ia akan kelihatan seperti ini:

    #! / Bin / Bash
    gema "Pilih perkhidmatan"
    baca PERKHIDMATAN
    # PERKHIDMATAN = 'mysql'
    sekiranya ps ax | grep -v grep | grep $ SERVICE> / dev / null
    kemudian
    echo "Servis $ SERVICE sedang berjalan"
    lagi
    echo "Perkhidmatan $ SERVICE dihentikan"

  11.   Juan Carlos C kata

    Saya sangat praktikal dengan skrip anda, tetapi saya mencari skrip khas untuk menyelesaikan masalah yang saya hadapi, seperti berikut: Kami mempunyai pelayan aplikasi di Syarikat yang pengguna dalaman mengaksesnya melalui telnet, dan melaksanakan aplikasi khas yang terhad Untuk lesen, pengguna menyalahgunakan dan membuka lebih dari satu telnet untuk mengambil alih 2 atau lebih lesen, jadi skrip yang saya fikirkan adalah bahawa dengan beberapa kaedah, periksa proses telnet mana yang tidak aktif selama lebih dari 2 jam dan oleh itu hantar ke pid itu, bolehkah anda menolong saya?

    1.    diego kata

      Pasang program berikut

      bakat pasang autolog

      Dan anda mempunyai fail konfigurasi di /etc/autolog.conf

  12.   Tito kata

    Bagus, kawan, saya boleh mengajukan soalan kepada anda, saya memerlukan skrip shell dengan pilihan dan saya telah berdasarkannya dan ia berfungsi dengan baik, tetapi salah satu pilihannya adalah untuk menghantar e-mel (menggunakan postifix), ia meminta subjek, teks dan penerima di skrin dan apa yang dihantar dan periksa apakah ia dihantar dengan betul, dengan mailq saya dapat melihat barisan dan melihat apakah ia dihantar, tetapi bagaimana cara saya menghantar e-mel melalui perintah menggunakan pemboleh ubah yang menerima subjek, teks dan penerima? 🙁

    1.    KZKG ^ Gaara kata

      Tulis ke e-mel saya (kzkggaara [at] desdelinux [dot] net) untuk bercakap dengan lebih tenang, saya akan menolong anda dengan senang hati 🙂

      1.    Tito kata

        Terima kasih kawan, anda berjaya!

  13.   Fer kata

    Helo baik.
    Saya telah menemui contoh-contoh yang sangat baik ketika saya memerlukan menu.
    Saya sudah berjaya dan tidak berjaya (pada langkah sebelumnya).
    Saya mempunyai 247 elemen, yang merujuk kepada domain wilayah yang berbeza.
    Apa yang saya perlukan ialah menu dari mana memilih negara:
    #! / Bin / Bash
    jelas
    semasa:
    do
    gema »Pilih negara untuk dicuba»
    gema «1. Afghanistan (AF) »
    gema «2. Albania (AL) »
    gema «3. Jerman (DE) »
    gema «5. Angola (AO) »
    gema «6. Anguilla (AI) »
    .. dan berterusan sehingga 247

    echo -n "Pilih pilihan [1 - 247]"
    pilihan membaca
    kes $ pilihan dalam
    1) echo "ini anda:"; whoami ;;
    2) gema "anda mempunyai ini"; df ;;
    3) gema ""; uname -r ;;
    4) gema "bye"; jalan keluar 1 ;;
    5) echo "ini anda:"; whoami ;;
    6) echo "ini anda:"; whoami ;;
    ... Dan berterusan sehingga 247
    *) echo «$ opc adalah pilihan yang tidak sah. Begitu sukar? ";
    gema "Tekan kekunci untuk meneruskan ...";
    baca foo ;;
    bahawa C
    dilakukan

    Kelakuannya adalah seperti berikut:
    Apa-apa pilihan kecuali 4, yang merupakan output, menghapus nombor yang dimasukkan dan menunggu nombor baru.
    Masuk 4 keluar.
    Sekiranya saya meletakkan kod 4 di baris lain (katakanlah 150) ia dikeluarkan sama tanpa masalah.
    Saya juga telah mencuba memasukkan kod dalam format ini:
    151) gema "ini anda:";
    siapakah saya ;;
    dengan hasil yang sama.
    Saya tertanya-tanya apakah ada pilihan yang lebih baik untuk menu yang panjang dan tentu saja saya juga salah.
    Bantuan akan sangat dihargai, terima kasih

  14.   Hanya Raul kata

    sangat baik ... saya rasa sangat bagus untuk masuk ke dalam cengkerang

    terima kasih

  15.   Marcos kata

    hei bagaimana saya boleh membuat bash saya berfungsi dengan fail
    contoh:

    muat naik.sh fotodelavecina.jpg

    memikirkan bahawa skrip bash saya "upload.sh" mempunyai maklumat akses ke ftp saya

    salam dan terima kasih 😀

  16.   netzulo ntx kata

    Tuan baik, terima kasih banyak untuk semua skrip, saya telah menyediakan pelayan CentOS dan anda tidak tahu sejauh mana templat ini sampai kepada saya, sila hubungi saya melalui e-mel. Saya ingin mencadangkan sesuatu kepada anda

  17.   Gabriel Balderramos kata

    Mengapa anda menggunakan baca foo semasa membuat menu? jawapan pantas yang saya perlukan