Linux Shell脚本教程:基础知识

时间:2020-03-21 11:46:07  来源:igfitidea点击:

如果我们是Linux或者Unix用户,那么默认情况下我们已经在使用Shell。
Linux中的每个用户都使用shell程序与系统进行交互。
Shell只不过是一个程序,可以让我们进行日常活动。
莱纳斯·托瓦尔兹(Linus Torvalds)在他的一次采访中表示。

“没有人真正使用操作系统。
人们在计算机上使用程序,操作系统生命中的唯一任务就是帮助这些程序运行。
操作系统永远不会独自做任何事情,它只是在等待程序来请求某些资源,在磁盘上请求某个文件或者连接到外部世界.” -Linus Torvalds(Linux内核的创建者)

因此,基本上,我们永远不会直接与操作系统进行交互,而总是使用程序与操作系统进行交互。
我们在计算机/或者服务器上所做的一切都通过程序来完成。
无论。

shell就是一个使我们可以与操作系统进行交互的程序。
我们与操作系统的交互将始终使用某种程序。
Shell使我们可以启动其他程序,并在操作系统中执行不同的操作。
Shell是用于执行程序的用户界面。
用户界面(shell)独立于操作系统。

“shell”一词本身源于以下事实:它是操作系统顶部的一层(操作系统的shell),它使我们可以执行其他程序和命令。

与操作系统类似,shell的flavor 和分布也有所不同。
不同的Shell程序也具有其自己的一组功能和命令。
shell的选择取决于用例和要求。
本教程系列将主要关注bash shell。

Shell是一个完全独立于操作系统本身的程序,导致开发了不同的Shell。
Bash shell在已开发的各种shell中最为流行,并且在几乎所有的nix操作系统家族中都得到了广泛的采用。
实际上,bash是大多数Linux发行版中的默认shell。

Bourneshell是第一个广泛使用的shell。
伯恩(Bourne)这个名字来自创作者(史蒂文·伯恩(Steven Bourne))。
它是在贝尔实验室(Unix的诞生地)创建的。
在大多数Unix操作系统(不是Linux)中,它是一种流行的选择。
实际上,它仍然在许多主要的Unix版本中使用。
Bourne shell于1977年发布。
它包含编程功能,如创建变量,流程控件等。
Unix7版包含Bourne shell。
该shell程序可在Unix之类的/bin/sh之类的操作系统中使用。

如前所述,我们将更加专注于bash shell。
Bash代表Bourne Again Shell。
它是由Biran Fox在1988年创建的。
Bash是GNU项目的一部分。
我们可能在想什么是GNU Project?

GNU项目是由Richard Stallman发起的。
GNU项目的主要动机是使操作系统与UNIX(而非Unix)非常相似。
现代操作系统中包含如此多的程序。
正如我们之前讨论的那样,没有任何程序可供用户交互的操作系统是无用的(因为我们人类总是与程序进行交互)。
Richard Stallman和其他人在GNU项目中开始为所有Unix程序编写替换程序。
如果我们使用的是GNU/Linux发行版(例如Ubuntu,Red Hat,Suse,Centos等),则实际上是在使用GNU程序。

Bash本身是一个GNU程序,用来代替Unix中的Bourne shell。
我们可以在下面的链接中找到我们在日常生活中使用的所有GNU程序的列表。

GNU程序列表

Bash是所有Linux发行版中所有用户的默认shell。

登录服务器时,登录后所获得的环境通常是bash shell。
这是因为bash shell是为我们提供与操作系统进行交互并触发其他程序和命令的界面的程序。

让我们看看登录服务器后的样子。
登录服务器后获得的界面称为终端。
Shell终端。
下面显示的是在基于RedHat和Ubuntu的发行版中获得的shell终端外观。

在RedHat中,终端默认如下所示:

[sarath@www ~]$

在基于Ubuntu/Debian的OS中,默认情况下,终端如下所示。

ubuntu@www:~$

终端看起来像这样是有原因的。
这是因为bash shell中的特定配置设置。
我们可以在更改任何程序的设置时随意更改此设置。

与Shell相关的设置大部分是使用变量配置的。
稍后我们将详细介绍变量,但现在仅考虑将变量作为占位符以保存用户给定的值。
Bash会根据用户为这些变量分配的值来更改其行为和外观。

Shell的外观由称为PS1的变量控制(即,如我们在上面的示例中看到的Shell提示符)。
由于这是一个变量,因此我们可以更改其值(占位符的值)。
变量的当前值如下所示。

[root@www ~]# echo $PS1
[\u@\h \W]$

上面显示的输出来自基于RedHat的发行版。
在任何其他发行版中,输出应相似或者略有不同(默认外观完全无关紧要,因为我们可以按自己喜欢的方式更改PS1占位符的值。
)。

echo命令是shell内置命令,主要用于在屏幕上显示给定的字符串(即,在屏幕上打印一些内容。
)。
shell内置意味着它是bash程序本身的一部分(即echo命令不是外部程序。
它是bash程序本身的一部分。
bash提供了许多类似于echo的内置命令。

我们可以使用另一个称为type的命令来确定命令是bash的一部分还是外部程序。

root@www:~# type echo
echo is a shell builtin

如果特定命令不是bash shell的一部分,则type也会显示该命令(以及命令实际所在的路径)。

root@www:~# type mkdir
mkdir is /bin/mkdir

现在让我们进一步了解PS1变量(占位符)。
如前所示,PS1的输出通常看起来像[_@ \ h \ W] \ $。
让我们了解这意味着什么。

  • u代表当前用户名(我们当前登录时使用的用户名)
  • h机器的主机名。好吧,直到第一个“。” ...如果服务器的主机名是www.example.com,则此字段将显示www(即:直到第一个。)
  • W当前工作目录(如果用户在主目录中,它将显示~符号。)

如果打开bash的手册页,则可以使用定制PS1变量(在PROMPTING部分下)查看所有可用的值。

好man 只是在GNU/Linux操作系统中访问文档的一种方法。
我们可以使用man命令打开程序的手册页,如下所示。
下面显示的命令将打开bash本身的文档,我们可以在PROMPTING部分中找到上述内容。

#man bash

如何在Bash Shell中更改这些占位符值或者变量以更改Shell的行为或者外观?

更改这些占位符的值非常简单。
就像说PS1等于兴趣的新值一样简单(如下所示)。
我们将使用等于运算符来分配一个值。

[root@www ~]# PS1='[\u@\H \W]$'
[[email protected] ~]#

在上面显示的示例中,我将PS1中的小写h更改为大写H。
大写字母H代表完整的主机名。

类似于PS1占位符(变量),也有PS2.
让我们看看PS2变量的默认值是多少。

[[email protected] ~]#echo $PS2
>

PS2变量值是>。
请记住,这些占位符不过是bash shell的设置。
行为或者外观将根据分配给这些占位符的值而改变。

如果键入一些不完整的命令并按Enter,bash shell将显示PS2值。
这表明前一个命令不完整,我们需要完成它。
例如,让我故意输入不完整的ls命令。

[[email protected] ~]#ls -l '
>

请参阅上面的>。
与PS1类似,我们也可以更改PS2的值。
让我们对其进行更改,然后再次通过迷惑/不完整的ls命令进行确认。

[[email protected] ~]#PS2=+
[[email protected] ~]#ls -l '
+

在上面的示例中,我为PS2变量分配了+值,而不完整的命令输出反映了同样的情况。

与PS1和PS2相似,还有另一个占位符(变量),称为PATH。
该PATH变量至关重要,因为此变量告诉bash shell有关搜索命令或者程序的位置的信息。

Bash具有许多用户友好的功能,可以帮助用户找到命令(命令是程序)而无需完全记住它。
实际上,如果我们要求shell显示以字母“ a”开头的所有命令,它将向我们显示。
我们可以继续输入字母并向shell提出建议。
这是使用键盘上的TAB字符触发的。

如果我在终端中键入“ ls”并在键盘上多次按TAB键,则shell将向我们显示以“ ls”开头的命令建议(如下所示)。
这样,我们可以轻松找到所需的命令。

[[email protected] ~]#ls
ls        lsblk     lscpu     lslocks   lsmod     lspci     lss3-2.7  
lsattr    lscgroup  lsinitrd  lslogins  lsof      lss3      lssubsys

我们可能会想:“ shell如何记住所有以我们键入的字母开头的命令?”。
实际上,shell不会记住所有以特定字母或者单词开头的命令。
键入字母或者单词,然后按TAB键后,shell程序便会开始在设置的位置搜索以该字母或者单词开头的程序。
搜索发生在用户使用PATH变量指定的多个位置。

[[email protected] ~]#echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin

在上面显示的PATH变量输出中,我们可以看到shell进行搜索操作以查找程序和命令的位置列表。
每个位置均以:符号分隔。

类似于任何其他变量,也可以通过为shell程序添加新位置来搜索来更改/修改PATH变量。

PATH=${PATH}:/opt/bin

在上述变量分配中,使用新的添加搜索路径(/opt/bin)修改了PATH变量。
${PATH}将扩展到已经存在的位置列表(如前所示),并从我们的/opt/bin位置再添加一个。

PATH变量对于shell程序正常运行并为我们提供建议或者让我们直接键入命令的用户友好特性非常重要。
如果没有PATH变量,则必须使用程序的完整位置执行程序。
例如,如果没有PATH变量,我们将永远无法执行ls命令。
ls命令将必须使用/bin/ls执行。
这是因为,如果没有PATH变量,shell将不知道ls程序位于何处。
因此,我们将必须提供正确的位置,然后提供命令。

与bash shell变量类似,还有其他变量完全是特定于工具的。
ls命令,less命令等系统工具都有自己的变量。
如果为这些工具特定的变量设置了值,则它们将相应地对输出进行行为/格式化。
例如,LS_OPTIONS变量用于ls命令。
LESS变量用于较少的命令。

LS_OPTIONS ='-color = yes'将为ls命令输出添加颜色。
LESS ='-X'将整理外观,减少命令输出。

除了所有这些bash特定和工具特定的变量之外,我们还可以拥有要使用的自己的脚本特定变量。
我们将在bash的专用部分中介绍该部分。

什么是Shell脚本?

我们已经了解到shell是用户可以与操作系统进行交互的主要用户界面这一事实。
使用shell程序的用户可以执行程序。
不同的命令(程序)在系统中获得不同的结果。
脚本不过是一个文件,其中包含一系列以正确顺序获得特定结果的命令(程序)。

一个示例可以是备份脚本(需要定期备份的脚本),该脚本可以对目录进行备份,并在完成后发送电子邮件警报。
另一个示例可以是监视脚本,该脚本监视服务器上的内存使用情况,并根据消耗的内存百分比发送警报。

如何编写Shell脚本?

如上所述,脚本不过是包含一系列命令的文件。
因此,我们可以非常轻松地创建它。
让我们创建一个示例脚本以实际了解它。

vim example_script.sh

example_script.sh文件的内容应类似于以下内容。
我们的示例脚本仅使用echo命令在屏幕上打印一条语句。
因此,我们的第一个脚本仅包含一个命令。

#!/bin/bash
echo "This is our first script"

好的。所以现在我已经准备好第一个脚本。但是如何执行这个shell脚本呢?

执行shell脚本可以通过多种方式完成。
执行它的第一步是提供可执行权限。
可以使用chmod命令给予可执行权限,如下所示。

chmod +x example_script.sh

上面显示的+ x选项将向系统中的用户,组和其他所有人授予可执行权限。
我们可以通过执行ls -l命令来验证文件的权限状态,如下所示。

root@localhost:~# ls -l example_script.sh
-rwxr-xr-x 1 root root 44 Aug 16 08:08 example_script.sh

现在,我们可以使用以下方法执行脚本。

执行shell脚本的方法:

这种方法很简单。
只需在脚本文件名前添加./,如下所示。

root@localhost:~# ./example_script.sh
This is our first script

从上面的输出中我们可以清楚地看到我们的shell脚本按照我们要求的方式工作。
它完成在屏幕上打印语句的工作。
上面显示的方法不是执行Shell脚本可用的唯一方法。
还有其他方法。