Shell脚本初学者-在linux中写Bash脚本,看完这一篇就够了

Shell脚本是Linux中过程自动化的重要组成部分。脚本可以帮助您在文件中编写一系列命令,然后执行它们。

这节省了您的时间,因为您不必一遍又一遍地编写某些命令。您可以高效地执行日常任务,甚至可以安排它们自动执行。

您还可以设置某些脚本在启动时执行,例如在启动新会话或设置某些环境变量时显示特定消息。

脚本的应用程序和用途很多,所以让我们深入了解一下。

在本文中,您将学习:

  1. 什么是bash shell?
  2. 什么是bash脚本,如何识别它?
  3. 如何创建第一个bash脚本并执行它。
  4. shell脚本的基本语法。
  5. 如何查看系统的调度脚本。
  6. 如何通过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(读、写、执行)权限

image-98

文件的颜色


可执行脚本以不同于其他文件和文件夹的颜色显示。

在我的例子中,具有执行权限的脚本显示为绿色。

image-99

如何创建第一个Bash脚本

让我们用bash创建一个简单的脚本,输出Hello World。

创建一个文件 hello_world.sh

touch hello_world.sh

找到Bash脚本路径

which bash

image-100

在我的例子中,路径是/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.

输出如下

Two ways to run scripts

Bash脚本的基本语法

就像任何其他编程语言一样,bash脚本遵循一组规则来创建计算机可以理解的程序。在本节中,我们将研究bash脚本的语法。

如何定义变量

我们可以使用variable_name=value语法来定义变量。要获得变量的值,请在变量前添加$。

#!/bin/bash
# A simple variable example
greeting=Hello
name=Tux
echo $greeting $name

image-104

Tux也是Linux吉祥物企鹅的名字。

Hi, I am Tux.

Hi, I am Tux.

算术表达式

下面是bash支持的数学计算操作符:

OPERATORUSAGE
+addition
-subtraction
*multiplication
/division
**exponentiation
%modulus

来跑几个例子

Note the spaces, these are part of the syntax

注意空格,它们是语法的一部分
数值表达式也可以使用以下语法计算并存储在变量中:

var=$((expression))

试一个例子

#!/bin/bash

var=$((3+9))
echo $var

image-109

使用上述方法计算分数不正确,并被截断。

对于十进制计算,我们可以使用bc命令将输出输出到特定的小数位数。bc (Bash Calculator)是一个命令行计算器,支持计算到一定数量的小数点。

echo "scale=2;22/7" | bc

其中scale定义输出中所需的小数位数。

Getting output to 2 decimal places

输出到小数点后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

image-111

数值比较逻辑运算符

比较用于检查语句的计算结果是真还是假。可以使用下面所示的操作符比较两个语句:

OPERATIONSYNTAXEXPLANATION
Equalitynum1 -eq num2is num1 equal to num2
Greater than equal tonum1 -ge num2is num1 greater than equal to num2
Greater thannum1 -gt num2is num1 greater than num2
Less than equal tonum1 -le num2is num1 less than equal to num2
Less thannum1 -lt num2is num1 less than num2
Not Equal tonum1 -ne num2is 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:

image-112

条件语句(决策)

条件是求值为布尔表达式(true或false)的表达式。要检查条件,可以使用if、if-else、if- if-else和嵌套条件。

条件语句的结构如下:

  • if...then...fi statements
  • if...then...else...fi statements
  • if..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

image-113

Test case #2

image-114

Test case #3

image-115

循环和跳过

For循环允许您执行语句的特定次数。

用数字循环:

在下面的例子中,循环将迭代5次。

#!/bin/bash

for i in {1..5}
do
    echo $i
done

Looping-with-numbers

使用字符串进行循环:

我们也可以循环字符串。

#!/bin/bash

for X in cyan magenta yellow  
do
	echo $X
done

Looping-with-strings

While循环

While循环检查条件并循环,直到条件为真。我们需要提供一个计数器语句来增加计数器以控制循环的执行。

在下面的例子中,((i += 1))是递增i值的计数器语句。

Example:

#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
   echo "$i"
  (( i += 1 ))
done

image-153

读 files

假设我们有一个sample_file.txt文件,如下所示:

image-151

我们可以逐行读取文件并在屏幕上打印输出。

#!/bin/bash

LINE=1

while read -r CURRENT_LINE
	do
		echo "$LINE: $CURRENT_LINE"
    ((LINE++))
done < "sample_file.txt"

Output:

Lines with line number printed

打印带有行号的行

如何执行带有反勾号的命令

如果需要在脚本中包含复杂命令的输出,可以将语句写在反引号内。

语法:

var= ` commands `

Example:

假设我们想要获得名称为tmpfs的挂载点列表的输出。我们可以编写这样的语句:df -h | grep tmpfs。

要将其包含在bash脚本中,我们可以将其括起来。

#!/bin/bash

var=`df -h | grep tmpfs`
echo $var

Output:

image-118

如何从命令行获取脚本的参数

可以在执行时为脚本提供参数。

$@表示参数的位置,从1开始。

#!/bin/bash

for x in $@
do
    echo "Entered arg is $x"
done

像这样执行试试:

./script arg1 arg2

image-155

如何通过调度通过cron作业自动化脚本

Cron是类Unix系统中存在的作业调度实用程序。您可以将作业安排为每天、每周、每月或在一天的特定时间执行。Linux中的自动化很大程度上依赖于cron作业。

下面是调度crons的语法:

# Cron job example
* * * * * sh /path/to/script.sh

这里,*分别代表分钟、小时、天、月和工作日。

下面是调度cron作业的一些示例。

SCHEDULESCHEDULED VALUE
5 0 * 8 *At 00:05 in August.
5 4 * * 6At 04:05 on Saturday.
0 22 * * 1-5At 22:00 on every day-of-week from Monday through Friday.


您可以在这篇博客文章中详细了解cron。

如何检查系统中已有的脚本
使用crontab

Crontab -l列出已为特定用户调度的脚本。

My scheduled scripts

我的调度脚本

使用查找命令

find命令有助于根据某些模式定位文件。由于大多数脚本以.sh结尾,我们可以像这样使用find脚本:

find . -type f -name "*.sh"

 表示当前目录。您可以根据需要更改路径。
-type f表示我们正在查找的文件类型是基于文本的文件。
*.sh表示匹配所有以.sh结尾的文件。

  • 37
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攻城狮Adam

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值