Bash是電腦程序,其功能是解釋指令。它基於Unix shell ,由GNU專案編寫,是大多數GNU/Linux發行版中的預設命令解釋器。它的名字是Bourne-Again Shell的縮寫,這是一個文字遊戲(born-again 意為重生) ,指的是Bourne shell (sh) ,它是最早的主要 Unix 解釋器之一。
今天我們將向您展示一些對開發人員非常有用的 shell 腳本。它們中的大多數可以在任何Unix shell 中運行,儘管有些腳本需要專門在Bash中運行。
防止非特權用戶運行腳本
有些腳本執行管理任務,因此我們可能只希望 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
驗證服務/進程是否正在運行
如果我們想知道某個服務或程式是否有任何進程正在執行,我們可以使用以下腳本(在本例中,它檢查Apache守護程式是否正在運行):
#!/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
在這種情況下,腳本會檢查檔案`loquesea.lock`是否存在。如果存在,腳本不會執行其任務。如果不存在,腳本會建立該文件,執行必要的任務,然後將其刪除。然而,這種方法並非完全可靠。如果腳本在運行時突然關閉,會發生什麼情況?
在這種情況下,鎖定文件不會被刪除,因此不允許我們再次運行腳本。 為了解決這些情況,我們可以使用 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`指令。它的語法基本上如下:`trap command signal [signal …];`,其中 `signal` 是你要捕捉的終止訊號。如果你想查看可用訊號的列表,可以執行 `kill -l` 指令。在前面的範例中,使用的訊號是 `INT` (捕獲 Ctrl+c 產生的終止訊號)、`TERM` (`kill` 指令產生的終止訊號)和 `EXIT` (正常的腳本終止,可能是因為沒有更多程式碼要執行,也可能是因為遇到了 `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"
文章結束。簡直太棒了
編輯:我得注意空格和製表符的用法,因為不知為何我總是弄錯¬¬