如何在 Linux 中创建一个 Shell 脚本
Shell 是操作系统的一个接口。它接受来自用户的命令并将它们解释给操作系统。如果你想同时运行一堆命令,你可以通过创建一个 shell 脚本来实现。如果您需要定期执行任务(例如备份),Shell 脚本非常有用。您可以列出这些命令并只用一个脚本来执行它们。让我们看看如何创建一个 shell 脚本并在 Linux 上运行它。
创建外壳脚本
登录到您的 Linux 机器并打开终端,导航到要存储 shell 脚本的文件夹。 Shell 脚本以扩展名“.sh”结尾。让我们创建我们的第一个 shell 脚本。输入
touch script.sh
现在,这个脚本文件默认是不可执行的,我们必须赋予这个文件可执行权限。输入
chmod +x script.sh
现在,我们将向这个 shell 脚本添加一些命令。使用您选择的任何文本编辑器(基于命令行或基于 GUI)打开此 shell 脚本并添加一些命令。我们将使用纳米。输入
nano script.sh
添加以下命令来测试这个 shell 脚本
echo This is my first shell script
touch testfile
ls
echo End of my shell script
保存更改,并通过键入运行 shell 脚本
./script.sh
![](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/How_to_Create_a_Shell_Script_in_linux_0.jpg)
以上步骤截图
可以看到,它执行了所有指定的命令。
shell 脚本中的注释
在 shell 脚本中任何以“#”开头的行都被视为注释,并在执行期间被 shell 忽略,除了 shebang 行,我们将在本文后面看到。让我们看一个例子。使用以下内容创建一个 shell 脚本。
# This is a comment
echo Testing comments in shell script
![](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/How_to_Create_a_Shell_Script_in_linux_1.jpg)
Shell 脚本中的注释
你可以看到,评论被忽略了。
Shell 脚本中的变量
是的,Shell 脚本支持变量的使用,我们不需要在声明时定义变量的类型。有两种类型的变量:
- 系统定义的变量
- 用户定义的变量。
系统定义的变量,也称为环境变量,通常是大写的。您可以使用 printenv 命令查看所有当前环境变量。用户定义变量由用户设置,仅在脚本执行期间存在。您可以通过简单地键入变量名称并使用 = 符号赋值来定义变量,并通过在变量名称前添加 $ 来访问变量。以下示例脚本中演示了变量。
# Accessing an Environment Variable
echo $USER
# Creating and accessing User defined Variable
variable_name="Geeksforgeeks"
echo $variable_name
![](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/How_to_Create_a_Shell_Script_in_linux_2.jpg)
Shell 脚本中的变量
定义 Shell 脚本解释器
Linux 中有许多可用的 Shell,例如 The bourne Shell(sh)、The Korn Shell(ksh) 和 GNU Bourne-Again Shell(bash)。为 sh shell 编写的脚本称为 shell 脚本,它们可以被 ksh 和 bash shell 解释。 ksh 和 Bash 是原始 sh shell 的改进版本,它们具有比 sh 更多的功能。 Bash 通常是大多数 Linux 发行版中的默认 shell,专门为 bash shell 编写的脚本称为 bash 脚本。
您可以指定脚本将使用哪个 shell,即使脚本是从另一个 shell 终端执行的。为此,请添加“#!”在脚本文件的顶部,然后是所选 shell 的绝对路径。要将 bash 指定为解释器,请在 shell 脚本顶部添加以下行。
#!/bin/bash
这条线称为shebang线。
注意:这仅在您的系统上安装了 bash 时才有效。
比较运算符
您可以在 shell 脚本中比较两个变量。我们通过这些比较来做出决定,我们将在本文后面看到如何做到这一点,但在此之前,这里是一些运算符的列表。
整数比较
Operator | Description |
---|---|
-eq | is equal to |
-ne | is not equal to |
-gt | is greater than |
-ge | is greater than or equal to |
-lt | is less than |
-le | is less than or equal to |
字符串比较
Operator | Description |
---|---|
== | is equal to |
!= | is not equal to |
\< | is less than, in ASCII alphabetical order |
\> | is greater than, in ASCII alphabetical order |
我们在 < 和 > 之前添加一个 \,因为在 [ ] 构造中键入它们时需要对其进行转义。现在,让我们看看这些在哪里使用。
条件语句
条件语句仅在满足某些条件时才用于执行代码块。 Shell 脚本支持使用条件语句。我们使用运算符来检查条件。让我们看几个条件语句。
如果语句
它检查条件,如果条件为真,则执行命令。
句法
if [ condition ]
then
#statements
fi
让我们看一个例子。
#!/bin/sh
x=10
y=11
if [ $x -ne $y ]
then
echo "Not equal"
fi
![](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/How_to_Create_a_Shell_Script_in_linux_3.jpg)
.if 语句
if-else 语句
在 if-else 语句中,您可以指定一组在不满足条件时运行的命令。
句法
if [ condition ]
then
#set of statements if the condition is true
else
#set of statements if the condition is false
fi
让我们看一个例子
#!/Syntaxbin/sh
x=10
y=10
if [ $x -ne $y ]
then
echo "Not equal"
else
echo "They are equal"
fi
![](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/How_to_Create_a_Shell_Script_in_linux_4.jpg)
.if-else 语句
还有其他条件语句,你可以在这里阅读它们。
注意:在指定要检查的条件时,在 [ 和 ] 之前输入一个空格,否则会出错。
循环
使用循环,您可以一遍又一遍地执行一组命令,直到满足某个条件。让我们看看一些循环。
While 循环
如果条件为真,它开始运行指定的命令并重复它们直到条件为假。
句法
while [ condition ]
do
#set of statements
done
让我们看一个例子。
#!/bin/sh
x=2
while [ $x -lt 6 ]
do
echo $x
x=`expr $x + 1`
done
![](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/How_to_Create_a_Shell_Script_in_linux_5.jpg)
While 循环
在将 expr 语句分配给变量时,我们将它包含在 ` 中。您可以在此处阅读有关 expr 命令的信息。
循环
在 for 循环中,变量迭代值列表并在没有更多值迭代时结束。
句法
for var in val1 val2 val3
do
#statements
done
让我们看一个例子。
#!/bin/sh
for var in 2 4 5 8
do
echo $var
done
![](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/How_to_Create_a_Shell_Script_in_linux_6.jpg)
for 循环
您可以在此处详细了解循环。
位置参数
位置参数是我们在执行脚本时传递给 shell 脚本的参数或值。它们由变量 $0、$1、$2 ... $9 访问。除此之外,它们还被 ${10}、${11} 等引用。 $# 存储传递参数的数量,$0 存储脚本的名称。让我们看一个例子来理解这一切。
#!/bin/sh
echo "No of arguments is $#"
echo "Name of the script is $0"
echo "First argument is $1"
echo "Second argument is $2"
要传递参数,只需在脚本名称后的终端中键入它们,如下所示。
![](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/How_to_Create_a_Shell_Script_in_linux_7.jpg)
位置参数
存储命令的输出
您可以将命令的输出存储在 shell 脚本中的变量中。有两种方法可以做到这一点。
句法
#Syntax 1
var=$(a valid linux command)
#Syntax 2
var2=`a valid linux command`
让我们看一个例子。
#!/bin/sh
b=$(pwd)
c=`pwd`
echo $b
echo $c
d=$(ls /bin | grep bash)
echo $d
![](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/How_to_Create_a_Shell_Script_in_linux_8.jpg)
存储命令的输出
shell 命令的退出代码
每当命令结束并将控制权返回给父进程时,它都会返回 0 到 255 之间的退出代码。退出代码 0 表示命令成功,任何其他退出代码表示命令不成功。您可以通过访问 #? 来查看运行任何命令后的退出代码?多变的。请参见下面的示例。
![](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/How_to_Create_a_Shell_Script_in_linux_9.jpg)
shell命令的退出代码
您可以为您的 shell 脚本手动设置退出代码。这可以与条件语句一起使用,以传达脚本的目的是否已实现。
例子
#!/bin/sh
read x
if [ $x -ne 10 ]
then
echo failed
exit 1
else
echo passed
exit 0
fi
![](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/How_to_Create_a_Shell_Script_in_linux_10.jpg)
shell命令的退出代码