网站搜索

如何在 Linux 中创建简单的 Shell 脚本


创建 shell 脚本是 Linux 用户应该掌握的最基本技能之一。 Shell 脚本在自动执行重复性任务方面发挥着巨大作用,否则逐行执行会很乏味。

在本教程中,我们重点介绍每个 Linux 用户都应该具备的一些基本 shell 脚本操作。

1. 创建一个简单的 Shell 脚本

shell 脚本是包含 ASCII 文本的文件。我们将从创建一个简单的 shell 脚本开始,为此,我们将使用文本编辑器。有相当多的文本编辑器,既有命令行的,也有基于 GUI 的。在本指南中,我们将使用 vim 编辑器。

我们将从创建一个简单的脚本开始,该脚本在执行时显示“Hello world”。

vim hello.sh

将以下内容粘贴到文件中并保存。

#!/bin/bash
Print Hello world message
echo "Hello World!"

让我们逐行查看 shell 脚本。

  • 第一行 – #!/bin/bash – 称为 shebang 标头。这是一个特殊的结构,指示将使用什么程序来解释脚本。在本例中,这将是 /bin/bash 指示的 bash shell。还有其他脚本语言,例如 Python,由 #!/usr/bin/python3 表示,以及 Perl,其 shebang 标头由#!/usr/bin/perl
  • 第二行是注释。注释是描述 shell 脚本执行的操作以及脚本运行时不执行的操作的语句。注释前面始终带有井号 #
  • 最后一行是在终端上打印“Hello World”消息的命令。

下一步是通过使用 chmod 命令分配执行权限来使脚本可执行,如图所示。

chmod +x  hello.sh

最后,使用以下任一命令运行 shell 脚本:

bash hello.sh
OR
./hello.sh

2. 使用条件语句执行代码

与其他编程语言一样,bash 脚本中使用条件语句来做出决策,语法上只有细微的变化。我们将介绍 ifif-elseelif 条件语句。

仅 if 语句示例

if 语句可用于测试单个或多个条件。我们将从 if 语句的基本使用开始测试单个条件。 if 语句由 if ... fi 块定义。

if command
then
  statement
fi

我们看一下下面的shell脚本。

#!/bin/bash
echo 'Enter the score'
read x

if [[ $x == 70 ]]; then
  echo 'Good job!'
fi

上面的 shell 脚本提示用户提供一个分数,然后将其存储在变量 x 中。如果分数对应于 70,脚本将返回输出“Good job!”。比较运算符==用于测试输入的分数(存储在变量x中)是否等于100

您可以使用的其他比较运算符包括:

  • -eq – 等于
  • -ne – 不等于
  • -lt – 小于
  • -le – 小于或等于
  • -lt – 小于
  • -ge – 大于或等于

例如,如果输入分数是小于 50 的任何值,下面的 if 语句 块就会打印出“努力工作”。

if [[ $x -lt 50 ]]; then
  echo 'Work Harder!'
fi

if-else 语句的示例

对于有两种可能结果的情况: – 无论是这个还是那个 – if-else 语句会派上用场。

if command
then
  statement1
else
  statement2
fi

下面的脚本读取输入分数并检查它是否大于或等于70

如果分数大于或等于 70,您会收到“干得好,您通过了!”消息。但是,如果分数低于 70,则会打印输出“You failed”。

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -ge 70 ]]; then
  echo 'Great job, You passed!'
else
  echo  'You failed'
fi

if-elif-else 语句的示例

在有多个条件和不同结果的场景中,使用 if-elif-else 语句。该语句采用以下格式。

if condition1
then
  statement1
elif condition2
then
  statement2
else
  statement3
fi

例如,我们有一个彩票脚本,用于检查输入的数字是否为 906030

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -eq 90 ]];
then
  echo “You have won the First Prize”

elif [[ $x -eq 60 ]];
then
  echo “You have won the Second Prize”

elif [[ $x -eq 30 ]];
then 
  echo “You have won the Second Prize”
else
  echo “Please try again”
fi

3. 使用带有 AND 逻辑的 If 语句

您可以将 if 语句与 AND 逻辑运算符一起使用,以便在满足两个条件时执行任务。 && 运算符用于表示AND 逻辑。

#!/bin/bash

echo 'Please Enter your user_id'
read user_id

echo 'Please Enter your tag_no'
read tag_id

if [[ ($user_id == “tecmint” && $tag_id -eq 3990) ]];
then
  echo “Login successful”
else
  echo “Login failure”
fi

5. 使用带有 OR 逻辑的 If 语句

当使用 OR 逻辑(由 || 符号表示)时,脚本需要满足任一条件才能给出预期结果。

#!/bin/bash

echo 'Please enter a random number'
read number

if [[ (number -eq 55 || number -eq 80) ]];
then
 echo 'Congratulations! You’ve won'
else
 echo 'Sorry, try again'
fi

使用循环结构

Bash 循环允许用户执行一系列任务,直到达到特定结果。这在执行重复性任务时非常有用。在本节中,我们将了解一些在其他编程语言中也可以找到的循环。

While 循环

这是最容易使用的循环之一。语法非常简单:

while  <some test>
do
 commands
done

下面的 while 循环执行时列出了从 1 到 10 的所有数字。

#!/bin/bash
A simple while loop
counter=1
while [ $counter -le 10 ]
 do
echo $counter
 ((counter++))
done

我们来讨论一下 while 循环:

变量counter被初始化为1。当变量小于或等于10时,计数器的值将递增,直到满足条件。 echo $counter 行打印从 1 到 10 的所有数字。

For循环

与 while 循环 一样,for 循环 用于迭代执行代码。 IE。尽可能多次地重复执行用户定义的代码。

语法是:

for var in 1 2 3 4 5 N
do
 command1
 command2
done

下面的for 循环迭代 1 到 10 并在屏幕上处理它们的值。

实现此目的的更好方法是使用双花括号 { } 定义范围,如图所示,而不是键入所有数字。

#!/bin/bash
Specify range in a for loop

for num in {1..10}
do
  echo $num
done

Bash 位置参数

位置参数是一种特殊变量,当值在 shell 上传递但无法赋值时,脚本中会引用该变量。位置参数从$0 $1 $2 $3 ……到$9。除了 $9 值之外,参数必须括在大括号中,例如 $ {10}、$ {11} ... 等。

执行脚本时,第一个位置参数 $0 采用 shell 脚本的名称。 $1参数采用在终端上传递的第一个变量,$2采用第二个变量,$3采用第三个变量,依此类推。

让我们创建一个脚本 test.sh,如图所示。

#!/bin/bash
echo "The name of the script is: " $0
echo "My first name is: " $1
echo "My second name is: " $2

接下来,执行脚本并提供第一个和第二个名称作为参数:

bash test.sh James Kiarie

从输出中,我们可以看到打印的第一个变量是 shell 脚本的名称,在本例中为 test.sh。此后,根据 shell 脚本中定义的位置参数打印出名称。

位置参数很有用,因为它们可以帮助您自定义输入的数据,而不是显式地为变量分配值。

Shell 命令退出代码

让我们首先回答一个简单的问题,什么是退出代码

用户或 shell 脚本在 shell 上执行的每个命令都有退出状态。退出状态是一个整数。

退出状态 0 表示命令成功执行,没有任何错误。 1 到 255 之间的任何值都表明命令失败或未成功执行。

要查找命令的退出状态,请使用 $? Shell 变量。

退出状态 1 表示一般错误或任何不允许的错误,例如在没有 sudo 权限的情况下编辑文件。

退出状态 2 表示命令或内置 shell 变量的使用不正确。

127 退出状态指向非法命令,通常会产生“找不到命令”错误。

处理脚本内 Shell 命令的输出

在 bash 脚本中,您可以将命令的输出存储在变量中以供将来使用。这也称为 shell 命令替换,可以通过以下方式实现。

variable=$(command)
OR
variable=$(/path/to/command)
OR
variable=$(command argument 1 argument 2 ...)

例如,您可以将 date 命令存储在名为 today 的变量中,并调用 shell 脚本来显示当前日期。

#!/bin/bash

today=$(date)

echo “Today is $today”

我们再举一个例子。假设您想要查找 Linux 系统上的有效登录用户。你会怎样做呢?首先,所有用户(系统用户、进程用户和登录用户)的列表存储在/etc/passwd 文件中。

要查看该文件,您需要使用 cat 命令。但是,要缩小登录用户的范围,请使用 grep 命令搜索具有 /bin/bash 属性的用户,并使用 cut -c 1-10 命令作为显示名称的前 10 个字符。

我们已将 cat 命令存储到 login_users 变量中。

#!/bin/bash
login_users=$(cat /etc/passwd | grep /bin/bash | cut -c 1-10)
echo 'This is the list of login users:
echo $login_users

我们关于创建简单 shell 脚本的教程到此结束。我们希望您发现这很有价值。