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
在运行脚本之前要求确认
有时,让用户确认一批语句的执行很有用,即要求用户键入“是”或“否”的典型消息。 我们可以这样做:
#!/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"
文章结束。简直太棒了
编辑:我得注意空格和制表符的用法,因为不知为何我总是弄错¬¬