任何程序中有用的shell腳本

巴什 它是一個計算機程序,其功能是解釋命令。 它是基於外殼的 Unix的 是為該項目編寫的 GNU 是大多數發行版中的默認命令解釋器 GNU / Linux的。 他的名字是縮寫 諜影重重 Shell (另一個伯恩貝殼)玩文字遊戲 (重生的意思是重生) 關於他 伯恩貝殼(sh),它是最早的主要 Unix 解釋器之一。

今天我們將展示一些對開發人員非常有用的 shell 腳本。 大多數工作在任何 shell 中 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

在本例中,已驗證該文件 無論如何鎖 存在。 如果存在,腳本不會執行其任務。 如果它不存在,它將創建該文件,運行它需要運行的任何任務,然後將其刪除。 但是,這並不完全可靠。 如果我們的腳本運行時突然關閉會發生什麼?

在這種情況下,鎖定文件不會被刪除,因此不允許我們再次運行腳本。 為了解決這些情況,我們可以使用 trap 命令,它允許我們在腳本意外結束時執行命令。 這是一個更高級的版本,它還將運行它的腳本的 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

讓我們更好地理解該命令 陷阱。 它的語法基本上是這樣的: trap command signal [signal …]; 其中 signal 是您要捕獲的終止信號。 如果您想查看可用信號的列表,可以運行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 或 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"

文章結束。 簡直太棒了😀

編輯: 你必須小心空格和製表符,由於某種原因它們不會出現 ØØ


發表您的評論

您的電子郵件地址將不會被發表。 必填字段標有 *

*

*

  1. 負責數據:MiguelÁngelGatón
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。

  1.   KZKG ^ Gaara 他說:

    該死的,他們太棒了 O_O…這對我在 Bash 中做的小事有很大幫助😀

  2.   ren434 他說:

    劇本非常棒!說真的,這是多麼偉大的貢獻!正是我一直在尋找的。

    PS:論壇掛了。

    1.    KZKG ^ Gaara 他說:

      是的,設置論壇的服務器離線了,我不知道為什麼......我們給負責該問題的朋友寫了一封電子郵件,看看他給我們回復了🙂

      問候。

  3.   ren434 他說:

    好吧,希望這沒什麼嚴重的。

  4.   左撇子 他說:

    Code Ninja 中也包含了“chanfle”嗎? XD

  5.   塔里貢 他說:

    我喜歡 bash 的強大功能😉,他們告訴我 C 語言的用途......,因為在 shell 腳本中有很多熟悉的命令。

  6.   克里斯托弗 他說:

    謝謝,我非常喜歡他們

  7.   天使之刃 他說:

    輸入參數的驗證非常有用。 我不知道如何製作菜單=)

  8.   日向_寧次 他說:

    傑出的…。 現在我可以給我的劇本一些“難度”了,油條呵呵呵呵

  9.   烏鴉 他說:

    很高興看到我們在 CodeNinja 的卑微工作如何對國際 Linux 社區有所幫助。

    1.    KZKG ^ Gaara 他說:

      清除! 🙂
      一切都是為了互相幫助、互相貢獻,而不是引火燒身,不是嗎? 😉

  10.   迭戈 他說:

    您可以通過添加選項來選擇您想了解的進程來改進正在運行的進程腳本,它看起來像這樣:

    #!/斌/慶典
    echo“選擇服務”
    閱讀服務
    #SERVICE='mysql'
    如果 ps 斧頭 | grep -v grep | grep -v grep $SERVICE > /dev/null
    然後
    echo“服務$SERVICE正在運行”
    其他
    echo "服務 $SERVICE 已停止"

  11.   胡安·卡洛斯·C. 他說:

    你的腳本非常實用,但我正在尋找一個特殊的腳本來解決我遇到的問題,如下所示:我們公司有一個應用程序服務器,內部用戶通過telnet訪問,並執行一個由於限製而受到限制的特殊應用程序對於許可證,用戶濫用並打開多個telnet 來接管2 個或更多許可證,因此我想到的腳本是通過某種方法檢查哪個telnet 進程處於非活動狀態超過2 小時,因此向該進程發送終止命令請問,你能幫我嗎?

    1.    迭戈 他說:

      安裝以下程序

      aptitude 安裝自動日誌

      並且您在 /etc/autolog.conf 中有配置文件

  12.   鐵托 他說:

    太好了,朋友,我可以問你一個問題,我需要一個帶選項的shell 腳本,我已經根據你的腳本編寫了它,效果很好,但其中一個選項必鬚髮送電子郵件(使用postifix),它要求提供主題、文本和屏幕上的收件人,它發送並檢查是否正確發送,使用mailq 我可以查看隊列並查看它是否已發送,但是如何使用接收主題、文本和收件人的變量通過命令發送電子郵件? 🙁

    1.    KZKG ^ Gaara 他說:

      寫信到我的電子郵件(kzkggaara[at]desdelinux[dot]net) 說話更平靜,我很樂意幫助你:)

      1.    鐵托 他說:

        非常感謝朋友,你通過了!

  13.   FER 他說:

    你好。
    當我需要菜單時,我遇到了這些很棒的例子。
    我已經嘗試過了,但無法讓它工作(在前面的步驟中)。
    我有 247 個元素,它們涉及不同的領土領域。
    我需要的是一個從中選擇國家/地區的菜單:
    #!/斌/慶典
    明確
    而:
    do
    echo » 選擇要治療的國家 »
    迴聲“1. 阿富汗(AF) »
    迴聲“2. 阿爾巴尼亞(AL) »
    迴聲“3. 德國(DE) »
    迴聲“5. 安哥拉(AO) »
    迴聲“6。 安圭拉(AI) »
    ..並繼續247

    echo -n "選擇一個選項 [1 – 247]"
    閱讀選項
    案例$選項
    1) echo“這是:”;whoami;;
    2) echo "你有這個";df;;
    3)回顯“”; uname -r;;
    4) echo "再見"; 退出 1;;
    5) echo“這是:”;whoami;;
    6) echo“這是:”;whoami;;
    …繼續247
    *) echo "$opt 是一個無效選項。 有這麼難嗎?”;
    echo "按一個鍵繼續...";
    讀富;;
    ESAC
    完成

    其行為如下:
    除 4(輸出)之外的任何選項都會刪除輸入的數字並等待新的數字。
    輸入4就出來了。
    如果我將 4 的代碼放在任何其他行(假設是 150)中,它仍然可以正常運行。
    我也嘗試過使用以下格式放置代碼:
    151)回顯“這是:”;
    我是誰;;
    結果相同。
    我想知道這麼長的菜單是否有更好的選擇,當然,我做錯了什麼?
    任何幫助將不勝感激,謝謝

  14.   只有勞爾 他說:

    優秀……進shell好像很好

    謝謝

  15.   馬科斯 他說:

    酷嘿,我怎樣才能讓我的 bash 使用文件
    例如:

    upload.sh fotodelavecina.jpg

    認為我的 bash 腳本“upload.sh”有我的 ftp 登錄信息

    問候和感謝😀

  16.   Netzulo ntx 他說:

    哇,伙計,非常感謝您提供的所有腳本,我已經設置了 CentOS 服務器,您不知道這些模闆對我來說效果如何,請通過電子郵件與我聯繫。 我想向你提出一些建議

  17.   加布里埃爾·巴爾德拉莫斯 他說:

    為什麼在製作菜單時使用 read foo ? 我需要的快速答案