Shell脚本初学者指南:基础知识

“ shell脚本”一词在Linux论坛中经常被提及,但是许多用户对此并不熟悉。学习这种简单而强大的编程方法可以帮助您节省时间,更好地学习命令行,并消除繁琐的文件管理任务。

什么是Shell脚本?

成为Linux用户意味着您需要使用命令行。不管喜欢与否,通过此界面完成的某些事情要比指向和单击要容易得多。您使用和学习命令行的次数越多,您就越能看到其潜力。好吧,命令行本身就是一个程序:shell。如今,大多数Linux发行版都使用Bash,这就是您真正要输入命令的地方。

现在,在使用Linux之前使用Windows的一些人可能会记得批处理文件。这些都是小的文本文件,您可以在其中填充要执行的命令,Windows会依次运行它们。这是完成某些事情的聪明而巧妙的方法,例如当您无法打开系统文件夹或创建快捷方式时,在高中计算机实验室中运行游戏。 Windows中的批处理文件虽然有用,但却是对Shell脚本的廉价模仿。

Shell脚本使我们可以对链中的命令进行编程,并让系统像脚本文件一样将它们作为脚本事件执行。它们还允许使用更多有用的功能,例如命令替换。您可以调用日期之类的命令,并将其输出用作文件命名方案的一部分。您可以自动执行备份,每个复制的文件都可以在其名称的末尾附加当前日期。脚本也不只是命令的调用。它们本身就是程序。通过脚本,您可以直接在操作系统界面内使用编程功能,例如“ for”循环,if / then / else语句等。而且,您不必学习其他语言,因为您使用的是命令行。

我认为,这确实是脚本编写的力量。在学习大多数主要编程语言的基础知识的同时,您可以使用已知的命令进行编程。需要做一些重复而乏味的事情吗?编写脚本!需要真正复杂的命令的快捷方式吗?编写脚本!是否想为某个东西构建一个真正易于使用的命令行界面?编写脚本!

在你开始之前

在开始编写脚本系列之前,让我们介绍一些基本信息。我们将使用bash shell,大多数Linux发行版都使用bash shell。 Bash适用于Mac OS用户和Windows上的Cygwin。由于它是如此通用,因此无论您使用什么平台,都应该能够编写脚本。此外,只要所引用的所有命令都存在,脚本就可以在多个平台上运行,而几乎不需要调整。

脚本编写可以轻松利用“管理员”或“超级用户”特权,因此最好在使用脚本之前先对其进行测试。也请使用常识,例如确保已备份要在其上运行脚本的文件。使用正确的选项(例如–i表示rm命令)也很重要,这样就需要进行交互。这样可以防止一些令人讨厌的错误。因此,请通读下载的脚本,并谨慎使用所拥有的数据,以防万一出错。

脚本的核心只是纯文本文件。您可以使用任何文本编辑器来编写它们:gedit,emacs,vim,nano…此列表不胜枚举。只要确保将其另存为纯文本,而不是富文本或Word文档即可。由于我喜欢nano提供的易用性,因此我将继续使用它。

脚本权限和名称

脚本像程序一样被执行,为了实现这一点,它们需要具有适当的权限。您可以通过在脚本上运行以下命令来使脚本可执行:

chmod + x〜/ somecrazyfolder / script

这将允许任何人运行该特定脚本。如果您希望仅将其使用限制在您的用户范围内,则可以改用以下方法:

chmod u + x〜/ somecrazyfolder / script

为了运行此脚本,您必须将cd放入正确的目录,然后按以下方式运行脚本:

cd〜/ somecrazyfolder

./script1

为了使操作更方便,可以将脚本放在主目录中的“ bin”文件夹中:

〜/箱

在许多现代发行版中,默认情况下不再创建此文件夹,但是您可以创建它。通常在这里存储属于您的用户而不是其他用户的可执行文件。通过在此处放置脚本,您可以像输入其他命令一样通过键入它们的名称来运行它们,而不必使用cd并使用“ ./”作为前缀。

但是,在命名脚本之前,应使用以下命令检查是否已安装使用该名称的程序:

哪个[命令]

很多人将他们早期的脚本命名为“ test”,而当他们尝试在命令行中运行它时,什么也没有发生。这是因为它与test命令冲突,后者在没有参数的情况下不会执行任何操作。请务必确保您的脚本名称与命令不冲突,否则您可能会发现自己在做自己不打算做的事情!

脚本编写准则

如前所述,每个脚本文件本质上都是纯文本。不过,这并不意味着您可以随心所欲地编写自己想要的东西。尝试执行文本文件时,shell将通过它们解析以获取有关它们是否为脚本以及如何正确处理所有内容的线索。因此,您需要了解一些准则。

  1. 每个脚本都应带有“#!/ bin / bash”
  2. 每行都是新命令
  3. 注释行以#开头
  4. 命令被()包围

哈希邦哈克

当外壳程序解析文本文件时,将文件标识为脚本的最直接方法是进行第一行操作:

#!/ bin / bash

如果您使用其他外壳,请在此处替换其路径。注释行以哈希(#)开头,但是在爆炸之后添加了bang(!)和shell路径,这是一种hack,它将绕过此注释规则,并强制脚本以该行指向的shell执行。

新行=新命令

每个新行都应被视为新命令,或者是更大系统的组成部分。例如,if / then / else语句将接管多行,但是该系统的每个组件都在新行中。不要让命令流到下一行,因为这会截断上一条命令,并在下一行给您带来错误。如果您的文本编辑器正在执行此操作,则出于安全考虑,应关闭文本换行。您可以按ALT + L的十亿分之一位关闭文本换行。

经常带#s的评论

如果以#开头,则忽略该行。它将变为注释行,您可以在其中提醒自己上一个命令的输出是什么,或者下一个命令将执行什么操作。同样,请关闭文本换行,或将您的注释分成多行,所有行均以哈希开头。保留大量注释是一个好习惯,因为它使您和其他人可以更轻松地调整脚本。唯一的例外是上述的Hash-Bang hack,因此请勿在#后面加上!s。 ;-)

命令用括号括起来

在较早的日子里,命令替换是用单个刻度线来完成的(`,共享〜键)。我们暂时不会去讨论这个问题,但是随着大多数人开始学习基础知识之后,提个个好主意,应该改为使用括号。这主要是因为当您将命令嵌套在其他命令中时,括号会更好。

您的第一个脚本

让我们从一个简单的脚本开始,该脚本允许您复制文件并将日期附加到文件名的末尾。我们称之为“ datecp”。首先,让我们检查一下该名称是否与某些内容冲突:

您会看到which命令没有输出,因此我们都已设置为使用该名称。

让我们在〜/ bin文件夹中创建一个空白文件:

触摸〜/ bin / datecp

而且,在忘记之前,让我们现在更改权限:

然后开始构建脚本。在您选择的文本编辑器中打开该文件。就像我说的那样,我喜欢nano的简单性。

纳米〜/ bin / datecp

并且,让我们继续进行操作,并在前提条件第一行中加上有关此脚本功能的注释。

接下来,我们声明一个变量。如果您曾经学习过代数,那么您可能知道那是什么。变量允许我们存储信息并使用它来做事。变量在其他地方引用时可以“扩展”。即,他们将不显示其名称,而是显示其存储的内容。您以后可以告诉该变量存储不同的信息,此后发生的任何指令都将使用新信息。这是一个非常漂亮的占位符。

我们将输入什么变量?好吧,让我们存储日期和时间!为此,我们将调用date命令。

查看以下屏幕截图,了解如何构建date命令的输出:

您可以看到,通过添加以%开头的不同变量,可以将命令的输出更改为所需的内容。有关更多信息,请查看date命令的手册页。

让我们使用date命令的最后一个迭代“ date +%m_%d_%y-%H.%M.%S”,并在脚本中使用它。

如果我们现在要保存此脚本,则可以运行它,它将为我们提供date命令的输出,就像我们期望的那样:

但是,让我们做些不同的事情。让我们给此命令指定一个变量名称,例如date_formatted。正确的语法如下:

变量= $(命令–options参数)

对于我们来说,我们将像这样构建它:

date_formatted = $(日期+%m_%d_%y-%H.%M.%S)

这就是我们所说的命令替换。我们实际上是在告诉bash,只要显示变量“ date_formatted”,就在括号内运行命令。然后,应显示命令给出的任何输出,而不是变量“ date_formatted”的名称。

这是一个示例脚本及其输出:

请注意,输出中有两个空格。都将显示echo命令的引号内的空格和变量前面的空格。如果您不希望出现空格,请不要使用空格。另请注意,如果没有添加此行的“ echo”行,该脚本将绝对不会提供任何输出。

让我们回到我们的脚本。接下来让我们添加命令的复制部分。

cp –iv $ 1 $ 2. $ date_formatted

这将调用带有–i和–v选项的复制命令。前者会在覆盖文件之前要求您进行验证,而后者将在命令行中显示正在关闭的内容。

接下来,您会看到我添加了“ $ 1”选项。编写脚本时,美元符号($)后跟数字表示调用脚本时该编号的参数。例如,在以下命令中:

cp –iv Trogdor2.mp3 ringtone.mp3

第一个参数是“ Trogdor2.mp3”,第二个参数是“ ringtone.mp3”。

回顾一下脚本,我们可以看到我们引用了两个参数:

这意味着在运行脚本时,我们需要提供两个参数以使脚本正确运行。第一个参数$ 1是将被复制的文件,并被替换为“ cp –iv”命令的第一个参数。

第二个参数$ 2将用作同一命令的输出文件。但是,您也可以看到它是不同的。我们添加了一个句点,并从上方引用了“ date_formatted”变量。好奇这是做什么的?

运行脚本时会发生以下情况:

您会看到输出文件被列为我为$ 2输入的内容,然后是句点,然后是date命令的输出!有道理吧?

现在,当我运行datecp命令时,它将运行此脚本,并允许我将任何文件复制到新位置,并自动在文件名的末尾添加日期和时间。对于归档内容很有用!

Shell脚本是使您的OS正常工作的核心。您也不必学习新的编程语言即可实现它。尝试在家中使用一些基本命令编写脚本,然后开始考虑可以将其用作什么。

你写剧本吗?对新手有什么建议吗?在评论区分享你的观点!这个系列还有更多内容!


$config[zx-auto] not found$config[zx-overlay] not found