Shell 脚本编写分步教程

2023-10-24

在本教程中,我们将讨论 shell 脚本以及如何制作第一个 shell 脚本。它们通常被称为 shell 脚本,但我们将它们称为 Bash 脚本,因为我们将在其他 Linux shell 中使用 Bash。

有 zsh、tcsh、ksh 和其他 shell。

 

 

在之前的文章中,我们了解了如何使用 Bash shell 以及如何使用Linux命令.

Bash 脚本的概念是运行一系列命令来完成工作。

要从 shell 单步运行多个命令,您可以在一行中键入这些命令并用分号分隔。


pwd ; whoami  

这是一个 Bash 脚本!

首先运行 pwd 命令,显示当前工作目录,然后运行 ​​whoami 命令以显示当前登录的用户。

您可以根据需要运行多个命令,但有限制。您可以使用此命令确定最大参数。


 getconf ARG_MAX  

好吧,将命令放入一个文件中怎么样,当我们需要运行这些命令时,我们只运行该文件。这称为 Bash 脚本。

首先,使用以下命令创建一个新文件触摸命令。在任何 Bash 脚本的开头,我们应该定义将使用哪个 shell,因为 Linux 上有很多 shell,Bash shell 就是其中之一。

shell脚本shebang

编写 Bash 脚本时键入的第一行是 (#!),后跟您将使用的 shell。

#!


#!/bin/bash  

如果您在 shell 脚本中的任何行前面使用井号 (#),则该行将成为注释,这意味着它将不会被处理,但是,上面的行是一个特例。这一行定义了我们将使用的 shell,在我们的例子中是 Bash shell。

每行输入一个 shell 命令,如下所示:


#!/bin/bash
# This is a comment
pwd
whoami  

您可以在同一行中键入多个命令,但必须用分号分隔它们,但最好将命令写在单独的行上;这将使以后的阅读变得更简单。

设置脚本权限

编写 shell 脚本后,保存文件。

现在,将该文件设置为可执行;否则,它会给你拒绝许可。您可以查看如何使用设置权限chmod 命令.


chmod +x ./myscript  

然后尝试通过在 shell 中键入以下内容来运行它:


./myscript  

是的,它被执行了。

制作你的第一个 Bash 脚本

正如我们从其他帖子中了解到的,打印文本是使用


echo  

command.

编辑您的文件并输入以下内容:


#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami  

查看输出:

完美的!现在我们可以运行命令并显示文本:


echo  

如果您不知道 echo 命令或如何编辑文件,我建议您查看以前的文章基本 Linux 命令.

 

使用变量

变量允许您存储信息以便在脚本中使用它。

您可以在 shell 脚本中定义两种类型的变量:

  • 环境变量
  • 用户变量

环境变量

有时你需要与系统变量进行交互;你可以通过使用来做到这一点环境变量.


#!/bin/bash
# display user home

echo "Home for the current user is: $HOME"  

请注意,我们将 $HOME 系统变量放在双引号之间,并且它正确打印了 home 变量。

如果我们想打印美元符号本身怎么办?


echo "I have $1 in my pocket"  

因为变量 $1 不存在,所以它不起作用。那么如何克服呢?

您可以使用转义字符,即美元符号之前的反斜杠 \,如下所示:


echo "I have \$1 in my pocket"  

现在可以了!!

用户变量

此外,您还可以在脚本中设置和使用自定义变量。

您可以用与以下相同的方式调用用户变量:


#!/bin/bash
# User variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"  

 


chmod +x myscript

./myscript  

 

命令替换

您可以使用命令替换从命令结果中提取信息。

您可以使用以下方法之一执行命令替换:

  • 反引号字符 (`)。
  • $() 格式。

确保键入反引号字符时,它不是单引号。

您必须用两个反引号将命令括起来,如下所示:


mydir=`pwd`  

或者另一种方式:


mydir=$(pwd)  

所以脚本可能是这样的:


#!/bin/bash

mydir=$(pwd)

echo $mydir  

您可以将命令的输出存储在 mydir 变量中。

 

数学计算

您可以使用 $(( 2 + 2 )) 格式执行基本数学计算:


#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2  

就这么简单。

 

如果-那么语句

您的 shell 脚本将需要条件语句。就像如果值小于 10,则执行此操作,否则执行此操作。你可以想象任何你想要的逻辑。

if-then 语句最基本的结构是这样的:

如果命令;然后

做一点事

fi

这是一个例子:


#!/bin/bash
if whoami; then
	echo "It works"
fi  

自从


whoami  

将返回我的用户,因此条件将返回 true,并且它将打印消息。

让我们更深入地挖掘并使用我们知道的其他命令。

检查用户是否存在

也许在用户文件中搜索特定用户


/etc/passwd  

如果存在记录,请在消息中告诉我。


#!/bin/bash
user=likegeeks
if grep $user /etc/passwd; then
	echo "No such a user $user"
fi  

我们使用


/etc/passwd  

文件。您可以查看我们的教程grep 命令.

如果用户存在,shell 脚本将打印该消息。

如果用户不存在怎么办?该脚本将退出执行,而不告诉我们该用户不存在。好吧,让我们进一步改进脚本。

 

if-then-else 语句

if-then-else 语句采用以下结构:

如果命令;然后

做一点事

else

做另一件事

fi

如果第一个命令运行并返回零,则表示成功,则不会命中 else 语句之后的命令;否则,如果 if 语句返回非零;这意味着语句条件失败,在这种情况下,shell 将执行 else 语句之后的命令。


#!/bin/bash
user=anotherUser
if grep $user /etc/passwd; then
	echo "The user $user Exists"
else
	echo "The user $user doesn’t exist"
fi  

到目前为止我们做得很好,继续前进。

现在,如果我们需要更多 else 语句怎么办?

嗯,这很简单,我们可以通过嵌套 if 语句来实现这一点,如下所示:

如果条件1;然后

commands

elif条件2;然后

commands

fi

如果第一个命令返回零;表示成功,它将执行它后面的命令,否则如果第二个命令返回零,它将运行它后面的命令,否则如果这些命令都不返回零,它将只执行最后的命令。


#!/bin/bash
user=anotherUser
if grep $user /etc/passwd; then
	echo "The user $user Exists"
elif ls /home; then
	echo "The user doesn’t exist"
fi  

你可以想象任何场景,也许如果用户不存在,使用创建一个用户


useradd  

命令或做任何其他事情。

 

组合测试

您可以使用 AND (&&) 或 OR (||) 命令组合多个测试。


#!/bin/bash
dir=/home/likegeeks
name="likegeeks"
if [ -d $dir ] && [ -n $name ]; then
	echo "The name exists and the folder $dir exists."
else
	echo "One test failed"
fi  

仅当两个测试都成功时,此示例才会返回 true;否则,就会失败。

此外,您还可以以同样的方式使用 OR (||):


#!/bin/bash
dir=/home/likegeeks
name="likegeeks"
if [ -d $dir ] || [ -n $name ]; then
	echo "Success!"
else
	echo "Both tests failed"
fi  

如果其中一个或两个成功,此示例将返回成功。

只有当他们两个都失败时,它才会失败。

 

数字比较

您可以使用数字比较检查在两个数值之间执行数字比较,如下所示:

number1 -eq number2 检查 number1 是否等于 number2。

number1 -ge number2 检查 number1 是否大于或等于 number2。

number1 -gt number2 检查 number1 是否大于 number2。

number1 -le number2 检查 number1 是否小于或等于 number2。

number1 -lt number2 检查 number1 是否小于 number2。

number1 -ne number2 检查 number1 是否不等于 number2。

作为例子,我们就尝试其中一个,其余的都是一样的。

请注意,比较语句位于方括号中,如图所示。


#!/bin/bash
num=11
if [ $num -gt 10 ]; then
	echo "$num is bigger than 10"
else
	echo "$num is less than 10"
fi  

该数字大于十,因此它将运行第一个语句并打印第一个回显。

字符串比较

您可以使用以下方式之一比较字符串:

string1 = string2 检查 string1 是否与 string2 相同。

string1 != string2 检查 string1 是否与 string2 不同。

string1

string1 > string2 检查 string1 是否大于 string2。

-n string1 检查 string1 是否长于零。

-z string1 检查 string1 的长度是否为零。

我们可以将字符串比较应用于我们的示例:


#!/bin/bash
user="likegeeks"
if [ $user = $USER ]; then
	echo "The user $user  is the current logged in user"
fi  

关于的一个棘手的注释大于和小于对于字符串比较,他们MUST be 用反斜杠转义因为如果仅使用大于符号,则会显示错误的结果。

所以你应该这样做:


#!/bin/bash
v1=text
v2="another text"
if [ $v1 \> "$v2" ]; then
	echo "$v1 is greater than $v2"
else
	echo "$v1 is less than $v2"
fi  

它可以运行,但会发出以下警告:


./myscript: line 5: [: too many arguments  

要修复此问题,请用双引号将 $vals 括起来,强制它保持为一个字符串,如下所示:


#!/bin/bash
v1=text
v2="another text"
if [ $v1 \> "$v2" ]; then
	echo "$v1 is greater than $v2"
else
	echo "$v1 is less than $v2"
fi  

关于的重要说明大于和小于用于字符串比较。检查以下示例以了解差异:


#!/bin/bash
v1=Likegeeks
v2=likegeeks
if [ $v1 \> $v2 ]; then
	echo "$v1 is greater than $v2"
else
	echo "$v1 is less than $v2"
fi  

sort myfile  

像极客

喜欢极客

测试条件认为小写字母比大写字母大。


sort  

与排序命令不同,排序命令的作用相反。

测试条件基于 ASCII 顺序。


sort  

而排序命令则基于系统设置的编号顺序。

 

文件比较

您可以使用以下运算符来比较和检查文件:

-d my_file 检查它是否是一个文件夹。

-e my_file 检查文件是否可用。

-f my_file 检查它是否是一个文件。

-r my_file 检查它是否可读。

my_file nt my_file2 检查 my_file 是否为newer比 my_file2.

my_file ot my_file2 检查 my_file 是否为older比 my_file2.

-O my_file 检查文件所有者和登录用户是否匹配。

-G my_file 检查文件和登录用户是否具有相同的组。

正如他们所暗示的那样,您将永远不会忘记他们。

让我们选择其中之一为例:


#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]; then
	echo "Directory $mydir exists"
	cd $mydir
	ls
else
	echo "NO such file or directory $mydir"
fi  

我们不会将它们中的每一个都作为示例。您只需按原样键入方括号之间的比较即可正常完成脚本。

还有一些其他高级的 if-then 功能,但我们将在另一篇文章中介绍。

就目前而言。我希望你喜欢它并继续练习。

谢谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell 脚本编写分步教程 的相关文章

随机推荐

  • 如何重命名 SQL Server 数据库

    Microsoft SQL Server 为您提供了多种重命名数据库的方法 您可以使用 SQL Server Management Studio 或运行 SQL 查询来重命名数据库 在重命名数据库之前 请记住 它可能会中断使用当前数据库名称
  • 如何使用SCP命令安全传输文件

    SCP 安全复制 是一个命令行实用程序 允许您在两个位置之间安全地复制文件和目录 With scp 您可以复制文件或目录 从本地系统到远程系统 从远程系统到本地系统 在本地系统的两个远程系统之间 当传输数据时scp 文件和密码都经过加密 因
  • 如何在 CentOS 7 上安装 VMware Workstation Player

    VMware是一个成熟稳定的虚拟化解决方案 允许您在一台机器上运行多个独立的操作系统 您可以创建自己的虚拟机并评估许多软件供应商作为虚拟设备分发的软件 这些软件可从VMware 解决方案交流 本教程将指导您完成在 CentOS 7 上安装
  • 如何在 Ubuntu 18.04 上安装 Java

    Java 是世界上最流行的编程语言之一 用于构建不同类型的跨平台应用程序 本教程介绍如何在 Ubuntu 18 04 上安装各种版本的 OpenJDK 以及 Oracle Java 相同的说明适用于 Ubuntu 16 04 和任何基于 U
  • 如何在 Ubuntu 18.04 上安装 Apache Cassandra

    Apache Cassandra 是一个免费的开源 NoSQL 数据库 不存在单点故障 它提供线性可扩展性和高可用性 而不会影响性能 Apache Cassandra 被许多组织使用 包括 Apple NetFlix eBay 和 Easo
  • Linux 中的超时命令

    timeout是一个命令行实用程序 它运行指定的命令 并在给定时间段后终止该命令 如果该命令仍在运行 换句话说 timeout允许您运行有时间限制的命令 这timeout命令是 GNU 核心实用程序包的一部分 几乎所有 Linux 发行版上
  • 如何在 CentOS 7 上添加交换空间

    交换空间是磁盘上的空间 当物理 RAM 内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 在大多数情况下 当在虚拟机上运行 CentOS 时 不存在交换
  • 如何在 Ubuntu 18.04 上设置 Apache 虚拟主机

    在本教程中 我们将提供有关如何在 Ubuntu 18 04 上设置 Apache 虚拟主机的分步说明 Apache 虚拟主机允许您在一台计算机上运行多个网站 使用虚拟主机 您可以指定站点文档根目录 包含网站文件的目录 为每个站点创建单独的安
  • 如何在 Ubuntu 20.04 上安装和配置 VNC

    虚拟网络计算 VNC 是一种图形桌面共享系统 允许您使用键盘和鼠标远程控制另一台计算机 它是 Microsoft 的开源替代品远程桌面协议 RDP 本文介绍如何在 Ubuntu 20 04 上安装和配置 VNC 服务器 我们还将向您展示如何
  • 如何在 Ubuntu 18.04 上禁用防火墙

    Ubuntu 附带了一个名为 UFW 简单防火墙 的防火墙配置工具 UFW 是一个用户友好的前端 用于管理 iptables 防火墙规则 其主要目标是使管理防火墙规则更容易 或者顾名思义 不复杂 强烈建议保持防火墙启用 但是 在某些情况下
  • 如何在 Debian 9 上安装 Jenkins

    Jenkins是一个开源自动化服务器 提供了一种设置持续集成和持续交付 CI CD 管道的简单方法 持续集成 CI 是一种 DevOps 实践 团队成员定期将代码更改提交到版本控制存储库 然后运行自动化构建和测试 持续交付 CD 是自动构建
  • 如何在 Debian 10 上配置 MySQL (MariaDB) 主从复制

    MySQL 复制是将数据从一台数据库服务器 主服务器 复制到一台或多台服务器 从服务器 的过程 MySQL 支持多种复制拓扑 其中主 从拓扑是最著名的拓扑之一 其中一台数据库服务器充当主服务器 而一台或多台服务器充当从服务器 默认情况下 复
  • 如何在 Ubuntu 18.04 上安装 Ghost

    Ghost 是一个构建在 Node js 平台之上的现代源代码发布平台 它完全可定制且易于使用 使您可以以几乎零的学习曲线发布内容 在本教程中 我们将向您展示如何使用 Nginx 作为代理 免费的 Let s Encrypt SSL 证书
  • 使用 NumPy 范数计算向量和矩阵范数

    在线性代数中 范数是为向量空间中的每个向量分配严格正的长度或大小的函数 它是矢量大小的度量 从数学上来说 对于一个向量x the p 范数定义为 x p sum xi p 1 p 在本教程中 我们将使用numpy linalg norm f
  • 在 Pandas query() 中使用字符串方法:数据帧过滤

    The Pandas 中的 query 方法允许您过滤数据帧 并且当与字符串方法结合使用时 可能性变得广泛 在本教程中 您将学习如何在query 功能来细化和过滤数据 目录 hide 1 检查子字符串 str contains 2 str
  • Seaborn histplot(用直方图可视化数据)

    Seaborn 是最广为人知的数据可视化库之一 运行在Matplotlib 通过 Seaborn 我们可以渲染各种类型的绘图 并提供简单 直观且高度可定制的 API 来生成数据可视化 如果没有丰富的可视化 就很难理解数据并与数据进行交流 想
  • Kivy 教程 – 使用 Python 构建桌面 GUI 应用程序

    Kivy 是一个开源 Python 库 您可以使用它在 Windows Linux macOS Android 和 iOS 上创建应用程序 我们将讨论如何使用 Kivy 按钮 标签 回收视图 滚动视图 Kivy Canvas 和其他小部件来
  • NumPy 矩阵乘法(从理论到实际示例)

    矩阵乘法是线性代数中的基本运算 它采用一对矩阵并产生另一个矩阵 用数学术语来说 给定两个矩阵 A 和 B 乘积 AB 是通过 A 的行与 B 的列的点积来计算的 本教程旨在深入了解矩阵乘法NumPy 目录 hide 1 逐元素与矩阵乘法 2
  • Python相关矩阵教程(使用Pandas)

    在本博客中 我们将介绍一个重要的多变量数据描述性统计量 称为相关矩阵 我们将学习如何在 Python 中使用以下命令创建 绘制和操作相关矩阵Pandas 我们将讨论以下主题 目录 hide 1 What is the correlation
  • Shell 脚本编写分步教程

    在本教程中 我们将讨论 shell 脚本以及如何制作第一个 shell 脚本 它们通常被称为 shell 脚本 但我们将它们称为 Bash 脚本 因为我们将在其他 Linux shell 中使用 Bash 有 zsh tcsh ksh 和其