sh脚本和bash脚本
系统管理员经常编写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语句,然后调用出口1,该出口终止脚本。
if
[
" $USER "
! =
'jboss1'
] ;
then
echo
"Sorry, this script must be run as JBOSS1!"
exit
1
fi
echo
"continue script"
根
下一个示例脚本确保只有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脚本可以将参数作为输入。 以下是一些示例。 但是首先,您应该了解好的编程意味着我们不只是编写可以完成我们想要的应用的程序,还应该包括 我们必须编写无法完成我们不想要的应用程序。 我想确保在没有参数的情况下脚本不会做任何破坏性的工作。 因此,这是对y的第一个检查。 该条件检查参数##的值是否为零,如果为true,则终止脚本。
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编码的潜力提供一些启示。
翻译自: https://opensource.com/article/20/1/improve-bash-scripts
sh脚本和bash脚本