任何程序中有用的shell脚本

它是一个计算机程序,其功能是解释订单。 它基于外壳 Unix的 并为该项目而写 GNU 是大多数发行版中的默认外壳 GNU / Linux的。 他的名字是的首字母缩写 伯恩再造壳 (另一个壳伯恩),发挥文字 (重生意味着重生)伯恩贝壳(sh),它是Unix最早的主要解释器之一。

今天,我们将展示一些对开发人员非常有用的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

让我们更好地了解命令 陷阱。 它的语法基本上是这样的:陷阱命令信号[signal…]; 其中signal是要捕获的终止信号。 如果要查看可用信号的列表,可以运行命令kill -l。 对于前一种情况,使用了INT信号 (捕获由Ctrl + c产生的终止),期限 (由kill命令产生的终止) 和退出 (正常终止脚本,要么是因为没有更多的行可运行,要么是因为它遇到了退出命令).

选项菜单

为了制作一个菜单,允许用户选择一系列选项,我们可以使用以下方案:

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

文章结尾。 简直很棒😀

编辑: 您必须注意空格和制表符,由于某些原因它们不会出现¬¬


发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  1. 负责数据:MiguelÁngelGatón
  2. 数据用途:控制垃圾邮件,注释管理。
  3. 合法性:您的同意
  4. 数据通讯:除非有法律义务,否则不会将数据传达给第三方。
  5. 数据存储:Occentus Networks(EU)托管的数据库
  6. 权利:您可以随时限制,恢复和删除您的信息。

  1.   KZKG ^ Gaara

    他妈的他们很棒O_O ...它将对我在Bash中所做的小事情有很大帮助😀

  2.   ren434

    脚本超棒!真的是我一直在寻找的巨大贡献。

    PS:论坛关闭了。

    1.    KZKG ^ Gaara

      是的,安装论坛的服务器处于脱机状态,不知道为什么...我们给处理此事的朋友写了一封电子邮件,以了解他对我们的回应respond

      问候。

  3.   ren434

    嗯,我们希望它没什么大不了的。

  4.   左撇子

    忍者密码中也包含了“ chaff”吗? XD

  5.   塔里贡

    我喜欢bash power的功能,他们告诉我C语言的用途是……,因为在shell脚本中有许多熟悉的命令。

  6.   克里斯托弗

    谢谢,我真的很喜欢

  7.   天使之刃

    输入参数的验证非常有用。 我不知道如何制作菜单=)

  8.   日向_宁次

    大…。 现在我可以给脚本加些“硬度”

  9.   乌鸦

    很高兴看到我们在CodeNinja的不起眼的工作如何为国际Linux社区服务

    1.    KZKG ^ Gaara

      明确! 🙂
      一切都是为了共同帮助和贡献,而不是制造火焰,对吗? 😉

  10.   迭戈

    通过添加选项以选择要了解的流程,可以稍微改善正在运行的流程脚本,如下所示:

    #!/斌/庆典
    回显“选择服务”
    阅读服务
    #SERVICE ='mysql'
    如果ps斧| grep -v grep | grep $ SERVICE> / dev / null
    然后
    回显“ $ SERVICE服务正在运行”
    其他
    回显“ $ SERVICE服务已停止”

  11.   华·卡洛斯(Jua Carlos C)

    我有非常实用的脚本,但是我正在寻找一个特殊的脚本来解决我遇到的问题,如下所示:我们公司中有一个应用程序服务器,内部用户可以通过telnet访问它,并执行一个特殊的应用程序,限制对于许可证,用户滥用并打开多个telnet来接管2个或多个许可证,因此我认为该脚本是通过某种方法检查哪个telnet进程在超过2小时内处于非活动状态,因此向该终端发送kill pid,你能帮我吗?

    1.    迭戈

      安装以下程序

      aptitude安装自动日志

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

  12.   铁托

    太好了,朋友,我可以问你一个问题,我需要一个带选项的shell脚本,我已经基于它编写了脚本,并且效果很好,但是其中一个选项必须发送电子邮件(使用postifix),它要求输入主题,文本屏幕上显示收件人,收件人以及发送和检查邮件的内容,并通过mailq查看队列并查看是否已发送,但是如何使用接收主题,文本和收件人的变量通过命令发送邮件? 🙁

    1.    KZKG ^ Gaara

      Escríbeme a mi email (kzkggaara[at]desdelinux[dot]net) para hablar con más calma, te ayudo con mucho gusto 🙂

      1.    铁托

        非常感谢朋友,您通过了!

  13.   费尔

    你好
    我仅在需要菜单时才遇到这些出色的示例。
    我已经启动了它,但无法正常工作(在前面的步骤中)。
    我有247个元素,它们引用不同的领土领域。
    我需要的是一个从中选择国家的菜单:
    #!/斌/庆典
    清除
    而:
    do
    回声»选择国家尝试»
    回声«1。 阿富汗(AF)»
    回声«2。 阿尔巴尼亚(AL)»
    回声«3。 德国(DE)»
    回声«5。 安哥拉(AO)»
    回声«6。 安圭拉(AI)»
    ..一直持续到247

    echo -n“选择一个选项[1-247]”
    读取选项
    案例$选项
    1)回声“这就是你:”; whoami ;;
    2)回声“你有这个”; df ;;
    3)回显“”; uname -r ;;
    4)echo“ bye”;退出1 ;;
    5)回声“这就是你:”; whoami ;;
    6)回声“这就是你:”; whoami ;;
    …并持续到247
    *)echo«$ opc是无效的选项。 很难吗?”
    回声“按一个键继续...”;
    读foo ;;
    ESAC
    完成

    行为如下:
    除4以外的任何选项(输出)都会删除输入的号码并等待新的号码。
    输入4出来。
    如果我将4的代码放在其他任何行中(比如说150),它同样可以正常出现。
    我也尝试将代码设置为以下格式:
    151)回响“这是你:”;
    我是谁 ;;
    具有相同的结果。
    我不知道是否有这么长的菜单更好的选择,当然我也做错了。
    一个帮助将不胜感激,谢谢

  14.   只有劳尔

    很棒...我认为进入外壳非常好

    谢谢

  15.   框架

    太好了,嘿,我如何使bash与文件一起工作
    例如:

    上传.sh fotodelavecina.jpg

    以为我的bash脚本“ upload.sh”具有对ftp的访问信息

    问候和感谢😀

  16.   耐久网

    好人,非常感谢您提供的所有脚本,我已经设置了CentOS服务器,您不知道这些模板对我的影响如何,请通过电子邮件与我联系。 我想向你求婚

  17.   加布里埃尔·巴尔德拉莫斯(Gabriel Balderramos)

    为什么在制作菜单时使用read foo? 我需要的快速答案