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

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

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

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

什么是shell脚本(shell scripting)?

作为一个Linux用户,意味着你要玩弄命令行。不管你喜不喜欢,通过这个界面做一些事情要比点击和点击容易得多。使用和学习命令行越多,就越能看到它的潜力。嗯,命令行本身就是一个程序:shell。今天大多数Linux发行版都使用Bash,而这正是您真正要输入命令的地方。

现在,在使用Linux之前使用Windows的一些人可能还记得批处理文件。这些是小的文本文件,你可以填充命令来执行,Windows会依次运行它们。这是一个聪明和整洁的方式来完成一些事情,比如在你的高中计算机实验室运行游戏时,你不能打开系统文件夹或创建快捷方式。Windows中的批处理文件虽然有用,但却是shell脚本的廉价仿制品。

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

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

我想这就是脚本的力量。你可以用你已经知道的命令来编程,同时学习大多数主要的编程语言。需要做一些重复和乏味的事情吗?编写脚本!需要一个真正复杂的命令的快捷方式吗?编写脚本!想为某些东西构建一个真正易于使用的命令行界面吗?编写脚本!

开始之前

在开始编写脚本系列之前,让我们先介绍一些基本信息。我们将使用bashshell,这是大多数Linux发行版本机使用的。Mac OS用户和Windows上的Cygwin也可以使用Bash。因为它是如此的普遍,你应该能够脚本无论你的平台。此外,只要引用的所有命令都存在,脚本就可以在多个平台上工作,几乎不需要调整。

脚本可以很容易地使用“管理员”或“超级用户”权限,因此最好在脚本开始工作之前测试它们。还要使用常识,比如确保要对其运行脚本的文件有备份。使用正确的选项也非常重要,比如-i代表rm命令,这样就需要您的交互。这可以防止一些严重的错误。因此,通读你下载的脚本,小心处理你的数据,以防出错。

脚本的核心只是纯文本文件。您可以使用任何文本编辑器来编写它们:gedit、emacs、vim、nano……这个列表还在继续。只需确保将其保存为纯文本,而不是富文本或Word文档。因为我喜欢nano提供的易用性,所以我会使用它。

脚本权限和名称

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

chmod +x ~/somecrazyfolder/script1

这将允许任何人运行该特定脚本。如果您想将其仅限于您的用户使用,可以改用此选项:

chmod u+x ~/somecrazyfolder/script1

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

cd ~/somecrazyfolder

./script1

为了方便起见,您可以将脚本放在主目录的“bin”文件夹中:

~/bin

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

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

which [command]

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

脚本编写准则

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

如前所述,每个脚本文件本质上都是纯文本。但这并不意味着你可以随心所欲地写下你想要的东西。当试图执行一个文本文件时,shell将通过它们来分析它们是否是脚本,以及如何正确处理一切。因此,您需要了解一些准则。

  1. 每个脚本都应该有“#”!/“箱/bash”
  2. 每一行都是一条新命令
  3. 注释行以#
  4. 命令被()

哈希爆炸黑客

当shell通过文本文件进行解析时,将文件标识为脚本的最直接方法是将第一行:

#!/bin/bash

如果您使用另一个shell,请在此处替换它的路径。注释行以散列(#)开头,但添加了bang(!)之后的shell路径是一种黑客行为,它将绕过此注释规则,并强制脚本使用此行所指向的shell执行。

新行=新命令

每一个新行都应该被视为一个新命令,或者一个更大系统的组件。例如,If/then/else语句将接管多行,但该系统的每个组件都位于新行中。不要让命令溢出到下一行,因为这可能会截断上一个命令,并在下一行给您一个错误。如果您的文本编辑器正在这样做,为了安全起见,您应该关闭文本包装。您可以按ALT+L关闭nano位中的文本换行。

经常用#s评论

如果以#开始一行,则忽略该行。这将把它变成一个注释行,在这里您可以提醒自己上一个命令的输出是什么,或者下一个命令将做什么。同样,关闭文本包装,或者将注释分成多行,所有行都以哈希开头。使用大量的注释是一个很好的实践,因为它可以让你和其他人更容易地调整你的脚本。唯一的例外是前面提到的Hash Bang hack,所以不要跟着它!s、 ;—)

命令用括号括起来

以前,命令替换是用单个记号(`,共享~键)完成的。我们还不打算讨论这个问题,但是随着大多数人在学习了基础知识之后开始探索,最好还是用括号代替。这主要是因为在嵌套时(将命令放在其他命令中),括号效果更好。

你的第一个剧本

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

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

您可以看到which命令并没有输出,所以我们都设置为使用这个名称。

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

touch ~/bin/datecp

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

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

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

那我们就开始写剧本吧。在您选择的文本编辑器中打开该文件。就像我说的,我喜欢nano的简单性。

nano ~/bin/datecp

接下来,我们将先决条件放在第一行,并对这个脚本的功能进行注释。

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

接下来,让我们声明一个变量。如果你学过代数,你可能知道那是什么。变量允许我们存储信息并使用它进行操作。当在别处引用时,变量可以“扩展”。也就是说,它们将显示存储的内容,而不是显示它们的名称。以后可以告诉同一个变量存储不同的信息,之后发生的任何指令都将使用新信息。这是一个非常花哨的占位符。

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

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

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

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

让我们使用date命令的最后一次迭代“date+%m\%d\%y-%H.%m.%s”,并在脚本中使用它。

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

如果我们现在保存这个脚本,我们可以运行它,它会像我们期望的那样给我们date命令的输出:

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

但是,让我们做些不同的事情。让我们给一个变量名,比如这个命令的date\u格式。正确的语法如下:

variable=$(command –opti*** arguments)

对我们来说,我们会这样建造:

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

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

这就是我们所说的命令替换。我们实际上是告诉bash,每当变量“date\u formatted”出现时,运行括号内的命令。然后,应该显示命令给出的任何输出,而不是变量名“date\u formatted”。

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

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

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

请注意,输出中有两个空格。echo命令引号内的空格和变量前面的空格都会显示出来。如果你不想让他们出现,就不要用空格。还要注意,如果没有这个添加的“echo”行,脚本将完全没有输出。

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

cp –iv $1 $2.$date_formatted

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

这将使用–i和–v选项调用copy命令。前者会在重写文件之前要求您进行验证,后者会在命令行上显示正在关闭的内容。

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

cp –iv Trogdor2.mp3 ringtone.mp3

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

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

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

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

第二个参数$2将作为同一命令的输出文件。但是,你也可以看到这是不同的。我们添加了一个句点,并从上面引用了“date\u formatted”变量。好奇这是怎么回事?

下面是脚本运行时发生的情况:

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

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

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

 


Shell脚本是让操作系统为您工作的核心。你也不必学习一种新的编程语言来实现它。在家里试着用一些基本的命令编写脚本,开始思考你可以用它做什么。

 

你写剧本吗?对新手有什么建议吗?在评论中分享你的想法!本系列还有更多精彩!

  • 发表于 2021-04-10 05:43
  • 阅读 ( 129 )
  • 分类:互联网

你可能感兴趣的文章

2021年面向开发者、云工程师和devops的5大linux课程

...热衷于学习Linux管理细节的初学者准备的。从学习安装的基础知识到管理Linux系统,您将从零开始学习所有内容。沉浸在Linux发行版、开源软件和桌面的概念中。 ...

  • 发布于 2021-03-11 10:29
  • 阅读 ( 247 )

使用简单的shell脚本修复html格式

...开源下载。 Shell脚本使您能够专注于编程基础知识,因为最重要的工作是通过包含的命令来完成的。假设您想在用C编写的传统桌面应用程序中压缩一些文件,您要么需要编写一点代码来使用兼容的软件库来完成这...

  • 发布于 2021-03-13 00:12
  • 阅读 ( 237 )

什么是shell脚本,为什么要使用它

...令。这种执行模式称为shell脚本,本文将介绍shell脚本的基础知识。 ...

  • 发布于 2021-03-13 04:53
  • 阅读 ( 247 )

顶级网站和书籍,让您成为linux命令行英雄

...、不同的模式(交互式和非交互式)以及它是如何产生的基础知识开始,这个站点提供了一个全面的背景知识来帮助您理解命令行的机制。 ...

  • 发布于 2021-03-14 07:04
  • 阅读 ( 244 )

VisualStudio代码是mac的完美文本和脚本编辑器

Xcode是go-to-Mac开发环境,但对初学者来说可能有点过分。如果你很好奇,只是想玩一下,微软的visualstudio代码可能是更好的选择。 ...

  • 发布于 2021-03-14 07:11
  • 阅读 ( 202 )

用这些免费的在线交互式shell在浏览器中试用python

...无论您是在阅读这些Python示例,还是在复习数组和列表的基础知识,都可以在浏览器中测试代码。下面是我们找到的最好的在线Python解释器。 ...

  • 发布于 2021-03-15 00:25
  • 阅读 ( 372 )

如何使用applescript将bash脚本转换为可单击的应用程序

假设你是一个bash脚本向导,喜欢为不太懂技术的朋友和家人自动化任务。即使你给了他们一个脚本,完全解决了他们的问题,他们可能仍然担心自己使用终端。在这种情况下,您不妨手动为它们执行所有操作。 ...

  • 发布于 2021-03-21 09:39
  • 阅读 ( 248 )

初学者快速自动热键指南

...你成为熟练。但是现在,让我们用这个初学者指南来学习基础知识。 ...

  • 发布于 2021-03-21 16:59
  • 阅读 ( 321 )

如何编程树莓pi控制led灯

从树莓皮开始是一个令人兴奋的经历。对于初学者来说,开始编写代码和DIY电子产品从来都不是一件容易的事。 ...

  • 发布于 2021-03-24 09:16
  • 阅读 ( 281 )

关于python编程最常见的问题

...您可能还想尝试这个为期30天的Python挑战,它将立即教您基础知识。我们还有一个Python RegEx备忘表,您应该查看。 ...

  • 发布于 2021-03-25 18:32
  • 阅读 ( 440 )
vfs875
vfs875

0 篇文章