Shell脚本是Linux中过程自动化的重要组成部分。脚本可以帮助您在文件中编写一系列命令,然后执行它们。
这节省了您的时间,因为您不必一遍又一遍地编写某些命令。您可以高效地执行日常任务,甚至可以安排它们自动执行。
您还可以设置某些脚本在启动时执行,例如在启动新会话或设置某些环境变量时显示特定消息。
脚本的应用程序和用途很多,所以让我们深入了解一下。
在本文中,您将学习:
- 什么是bash shell?
- 什么是bash脚本,如何识别它?
- 如何创建第一个bash脚本并执行它。
- shell脚本的基本语法。
- 如何查看系统的调度脚本。
- 如何通过cron作业调度来自动化脚本。
Bash Shell简介
Linux命令行是由shell程序提供的。多年来,shell程序已经发展到满足各种选择。
可以将不同的用户配置为使用不同的shell。但是大多数用户更喜欢使用当前的默认shell。许多Linux发行版的默认shell是GNU Bourne-Again shell (bash)。Bash之后是Bourne shell (sh)。
当您第一次启动shell时,它使用位于.bashrc或.bash_profile文件中的启动脚本,该脚本允许您自定义shell的行为。
当以交互方式使用shell时,它在等待用户的命令时显示一个$。这称为shell提示符。
[username@host ~]$
如果shell以root身份运行,提示符将更改为#。超级用户shell提示符看起来像这样:
[root@host ~]#
Bash非常强大,因为它可以简化某些难以用GUI高效完成的操作。请记住,大多数服务器没有GUI,因此最好学会使用命令行界面(CLI)的功能。
什么是 Bash 脚本?
bash脚本是写在文件中的一系列命令。这些由bash程序读取和执行。程序逐行执行。
例如,您可以导航到某个路径,创建一个文件夹,并使用命令行在其中生成一个进程。
您可以通过将命令保存在bash脚本中并运行它来执行相同的步骤序列。您可以多次运行该脚本。
如何定义一个Bash脚本?
.sh的文件扩展名。
根据命名约定,bash脚本以.sh结尾。但是,bash脚本在没有sh扩展名的情况下也可以运行得很好。
脚本以bash bang开头。
脚本也用shebang标识。Shebang是bash #和bang !遵循bash shell路径。这是脚本的第一行。Shebang告诉shell通过bash shell执行它。Shebang只是bash解释器的绝对路径。
下面是shebang语句的一个例子。
#! /bin/bash
bash程序的路径可以不同。稍后我们将看到如何识别它。
执行权限
脚本对执行脚本的用户具有执行权限。
执行权限用x表示。在下面的示例中,我的用户对文件test_script.sh具有rwx(读、写、执行)权限
文件的颜色
可执行脚本以不同于其他文件和文件夹的颜色显示。
在我的例子中,具有执行权限的脚本显示为绿色。
如何创建第一个Bash脚本
让我们用bash创建一个简单的脚本,输出Hello World。
创建一个文件 hello_world.sh
touch hello_world.sh
找到Bash脚本路径
which bash
在我的例子中,路径是/usr/bin/bash,我将把它包含在shebang中。
撰写命令
我们将向控制台回显“hello world”。
我们的脚本看起来像这样:
#! /usr/bin/bash
echo "Hello World"
使用您选择的文本编辑器编辑文件hello_world.sh,并在其中添加上述行。
为用户提供执行权限。
修改文件权限,允许脚本执行,命令如下:
chmod u+x hello_world.sh
Chmod为指定用户修改文件的现有权限。我们给用户u加上+x。
执行脚本
您可以通过以下方式运行脚本:
./hello_world.sh
bash hello_world.sh
.
输出如下
Bash脚本的基本语法
就像任何其他编程语言一样,bash脚本遵循一组规则来创建计算机可以理解的程序。在本节中,我们将研究bash脚本的语法。
如何定义变量
我们可以使用variable_name=value语法来定义变量。要获得变量的值,请在变量前添加$。
#!/bin/bash
# A simple variable example
greeting=Hello
name=Tux
echo $greeting $name
Tux也是Linux吉祥物企鹅的名字。
Hi, I am Tux.
算术表达式
下面是bash支持的数学计算操作符:
OPERATOR | USAGE |
---|---|
+ | addition |
- | subtraction |
* | multiplication |
/ | division |
** | exponentiation |
% | modulus |
来跑几个例子
注意空格,它们是语法的一部分
数值表达式也可以使用以下语法计算并存储在变量中:
var=$((expression))
试一个例子
#!/bin/bash
var=$((3+9))
echo $var
使用上述方法计算分数不正确,并被截断。
对于十进制计算,我们可以使用bc命令将输出输出到特定的小数位数。bc (Bash Calculator)是一个命令行计算器,支持计算到一定数量的小数点。
echo "scale=2;22/7" | bc
其中scale定义输出中所需的小数位数。
输出到小数点后2位
如何读用户的输入呢
有时需要收集用户输入并执行相关操作。
在bash中,我们可以使用read命令接受用户输入。
read variable_name
要用自定义消息提示用户,请使用-p标志。
read -p "Enter your age" variable_name
Example:
#!/bin/bash
echo "Enter a numner"
read a
echo "Enter a numner"
read b
var=$((a+b))
echo $var
数值比较逻辑运算符
比较用于检查语句的计算结果是真还是假。可以使用下面所示的操作符比较两个语句:
OPERATION | SYNTAX | EXPLANATION |
---|---|---|
Equality | num1 -eq num2 | is num1 equal to num2 |
Greater than equal to | num1 -ge num2 | is num1 greater than equal to num2 |
Greater than | num1 -gt num2 | is num1 greater than num2 |
Less than equal to | num1 -le num2 | is num1 less than equal to num2 |
Less than | num1 -lt num2 | is num1 less than num2 |
Not Equal to | num1 -ne num2 | is num1 not equal to num2 |
Syntax:
if [ conditions ]
then
commands
fi
Example:
让我们比较两个数字并找出它们的关系:
read x
read y
if [ $x -gt $y ]
then
echo X is greater than Y
elif [ $x -lt $y ]
then
echo X is less than Y
elif [ $x -eq $y ]
then
echo X is equal to Y
fi
Output:
条件语句(决策)
条件是求值为布尔表达式(true或false)的表达式。要检查条件,可以使用if、if-else、if- if-else和嵌套条件。
条件语句的结构如下:
if...then...fi
statementsif...then...else...fi
statementsif..elif..else..fi
if..then..else..if..then..fi..fi..
(Nested Conditionals)
语法:
if [[ condition ]]
then
statement
elif [[ condition ]]; then
statement
else
do this by default
fi
为了创建有意义的比较,我们也可以使用AND -a和OR -o。
下面的语句翻译成:如果a大于40且b小于6。
if [ $a -gt 40 -a $b -lt 6 ]
Example: 我们通过读三角形边的长度来找出三角形的类型。
read a
read b
read c
if [ $a == $b -a $b == $c -a $a == $c ]
then
echo EQUILATERAL
elif [ $a == $b -o $b == $c -o $a == $c ]
then
echo ISOSCELES
else
echo SCALENE
fi
Output:
Test case #1
Test case #2
Test case #3
循环和跳过
For循环允许您执行语句的特定次数。
用数字循环:
在下面的例子中,循环将迭代5次。
#!/bin/bash
for i in {1..5}
do
echo $i
done
使用字符串进行循环:
我们也可以循环字符串。
#!/bin/bash
for X in cyan magenta yellow
do
echo $X
done
While循环
While循环检查条件并循环,直到条件为真。我们需要提供一个计数器语句来增加计数器以控制循环的执行。
在下面的例子中,((i += 1))是递增i值的计数器语句。
Example:
#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
echo "$i"
(( i += 1 ))
done
读 files
假设我们有一个sample_file.txt文件,如下所示:
我们可以逐行读取文件并在屏幕上打印输出。
#!/bin/bash
LINE=1
while read -r CURRENT_LINE
do
echo "$LINE: $CURRENT_LINE"
((LINE++))
done < "sample_file.txt"
Output:
打印带有行号的行
如何执行带有反勾号的命令
如果需要在脚本中包含复杂命令的输出,可以将语句写在反引号内。
语法:
var= ` commands
`
Example:
假设我们想要获得名称为tmpfs的挂载点列表的输出。我们可以编写这样的语句:df -h | grep tmpfs。
要将其包含在bash脚本中,我们可以将其括起来。
#!/bin/bash
var=`df -h | grep tmpfs`
echo $var
Output:
如何从命令行获取脚本的参数
可以在执行时为脚本提供参数。
$@表示参数的位置,从1开始。
#!/bin/bash
for x in $@
do
echo "Entered arg is $x"
done
像这样执行试试:
./script arg1 arg2
如何通过调度通过cron作业自动化脚本
Cron是类Unix系统中存在的作业调度实用程序。您可以将作业安排为每天、每周、每月或在一天的特定时间执行。Linux中的自动化很大程度上依赖于cron作业。
下面是调度crons的语法:
# Cron job example
* * * * * sh /path/to/script.sh
这里,*分别代表分钟、小时、天、月和工作日。
下面是调度cron作业的一些示例。
SCHEDULE | SCHEDULED VALUE |
---|---|
5 0 * 8 * | At 00:05 in August. |
5 4 * * 6 | At 04:05 on Saturday. |
0 22 * * 1-5 | At 22:00 on every day-of-week from Monday through Friday. |
您可以在这篇博客文章中详细了解cron。
如何检查系统中已有的脚本
使用crontab
Crontab -l列出已为特定用户调度的脚本。
我的调度脚本
使用查找命令
find命令有助于根据某些模式定位文件。由于大多数脚本以.sh结尾,我们可以像这样使用find脚本:
find . -type f -name "*.sh"
表示当前目录。您可以根据需要更改路径。
-type f表示我们正在查找的文件类型是基于文本的文件。
*.sh表示匹配所有以.sh结尾的文件。