系统管理员经常编写 Bash 脚本,有些脚本很短,有些脚本很长,以完成各种任务。
您是否看过软件供应商提供的安装脚本?他们通常会添加大量函数和逻辑,以确保安装正常进行,并且不会对客户的系统造成损害。多年来,我积累了各种增强 Bash 脚本的技术,我想分享其中的一些,希望能对其他人有所帮助。以下是为说明这些简单示例而创建的小型脚本集合。
入门
当我刚开始时,我的 Bash 脚本只不过是一系列命令,通常旨在节省标准 shell 操作的时间,例如部署 Web 内容。其中一项任务是将静态内容提取到 Apache Web 服务器的主目录中。我的脚本大致如下:
cp january_schedule.tar.gz /usr/apache/home/calendar/
cd /usr/apache/home/calendar/
tar zvxf january_schedule.tar.gz
虽然这节省了我一些时间和打字时间,但从长远来看,这肯定不是一个非常有趣或有用的脚本。随着时间的推移,我学习了使用 Bash 脚本来完成更具挑战性的任务的其他方法,例如创建软件包、安装软件或备份文件服务器。
1. 条件语句
与许多其他编程语言一样,条件语句一直是一个强大且常用的功能。条件语句使计算机程序能够执行逻辑。我的大多数示例都基于条件逻辑。
基本条件语句使用“if”语句。这使我们能够测试某些条件,然后我们可以使用这些条件来操纵脚本的执行方式。例如,我们可以检查 Java bin 目录是否存在,这将表明已安装 Java。如果找到,则可以使用该位置更新可执行路径,以启用 Java 应用程序的调用。
if [ -d "$JAVA_HOME/bin" ] ; then
PATH="$JAVA_HOME/bin:$PATH"
2. 限制执行
您可能希望限制脚本只能由特定用户运行。尽管 Linux 具有用于用户和组的标准权限以及用于启用此类保护的 SELinux,但您可以选择在脚本中放置逻辑。也许您想确保只有特定 Web 应用程序的所有者才能运行其启动脚本。您甚至可以使用代码将脚本限制为 root 用户。Linux 有几个环境变量,我们可以在此逻辑中进行测试。其中一个是 $USER,它提供用户名。另一个是 $UID,它提供用户的标识号 (UID),对于脚本,则提供执行用户的 UID。
用户
第一个示例显示了在具有多个应用程序服务器实例的多主机环境中,我如何将脚本限制为用户 jboss1。条件“if”语句本质上是在询问:“执行用户是否不是 jboss1?”当条件为真时,将调用第一个 echo 语句,然后调用 exit 1,这将终止脚本。
if [ "$USER" != 'jboss1' ]; then
echo "Sorry, this script must be run as JBOSS1!"
exit 1
fi
echo "continue script"
Root
下一个示例脚本确保只有 root 用户才能执行它。由于 root 的 UID 为 0,因此我们可以在条件 if 语句中使用 -gt 选项来禁止所有大于零的 UID。
if [ "$UID" -gt 0 ]; then
echo "Sorry, this script must be run as ROOT!"
exit 1
fi
echo "continue script"
3. 使用参数
就像任何可执行程序一样,Bash 脚本可以接受参数作为输入。以下是一些示例。但首先,您应该理解,良好的编程意味着我们不仅要编写满足我们需求的应用程序;我们还必须编写不能做我们不想做的事情的应用程序。我喜欢确保脚本在没有参数的情况下不会执行任何破坏性操作。因此,这是我要做的第一个检查。该条件检查参数数量 $# 是否为零,如果为真,则终止脚本。
if [ $# -eq 0 ]; then
echo "No arguments provided"
exit 1
fi
echo "arguments found: $#"
多个参数
您可以将多个参数传递给脚本。脚本用于引用每个参数的内部变量只是递增的,例如 $1、$2、$3 等等。我将使用以下行扩展上面的示例,以回显前三个参数。显然,需要额外的逻辑来根据总数正确处理参数。此示例仅为演示起见而简化。
echo $1 $2 $3
在讨论这些参数变量时,您可能想知道,“他跳过零了吗?”
嗯,是的,我跳过了,但我有一个很好的理由!确实存在 $0 变量,它非常有用。它的值只是正在执行的脚本的名称。
echo $0
在执行期间引用脚本名称的一个重要原因是生成一个日志文件,该日志文件的名称中包含脚本的名称。最简单的形式可能只是一个 echo 语句。
echo test >> $0.log
但是,您可能需要添加更多代码,以确保将日志写入到具有您认为对您的用例有帮助的名称和信息的位置。
4. 用户输入
在脚本中使用的另一个有用功能是它在执行期间接受输入的能力。最简单的方法是向用户提供一些输入。
echo "enter a word please:"
read word
echo $word
这也允许您向用户提供选择。
read -p "Install Software ?? [Y/n]: " answ
if [ "$answ" == 'n' ]; then
exit 1
fi
echo "Installation starting..."
5. 失败时退出
几年前,我编写了一个脚本,用于在我的计算机上安装最新版本的 Java 开发工具包 (JDK)。该脚本将 JDK 存档解压缩到特定目录,更新符号链接,并使用 alternatives 实用程序使系统了解新版本。如果 JDK 存档的解压缩失败,继续操作可能会破坏系统范围内的 Java。因此,我希望脚本在这种情况下中止。我不希望脚本进行下一组系统更改,除非存档已成功解压缩。以下是该脚本的摘录:
tar kxzmf jdk-8u221-linux-x64.tar.gz -C /jdk --checkpoint=.500; ec=$?
if [ $ec -ne 0 ]; then
echo "Installation failed - exiting."
exit 1
fi
让您演示 $? 变量用法的一种快速方法是使用以下简短的单行代码:
ls T; ec=$?; echo $ec
首先,运行 touch T,然后运行此命令。ec 的值将为 0。然后,删除 T,rm T,并重复该命令。ec 的值现在将为 2,因为 ls 报告错误情况,因为找不到 T。
您可以利用此错误报告来包含逻辑,就像我在上面所做的那样,以控制脚本的行为。
总结
我们可能会认为我们需要使用 Python、C 或 Java 等语言来实现更高的功能,但这不一定是真的。Bash 脚本语言非常强大。有很多东西需要学习才能最大限度地发挥其用处。我希望这些简单的示例能够阐明使用 Bash 进行编码的潜力。
8 条评论