shell here文档,here are shells

  shell here文档,here are shells

  此处文档

  从Shell脚本传递命令的一种特殊方式是使用here document。这个文档可以使执行的命令看起来像是由文件或键盘读取的,但实际上,它是由这个脚本读取的。

  here文档以在文档末尾重复出现的字符序列开始。它是外壳的重定向标签。在这种情况下,它会强制将命令输入到here文档中。这个特殊的序列作为一个标记告诉shell这个文档将在哪里结束。这个标记不能出现在要传递给命令的行上,所以最好把它们标记为最不常用或者最难忘的内容。

  比如下面这个例子:

  #!/bin/sh

  猫!时髦!

  你好

  这是一个

  文件

  !时髦!

  该脚本的输出如下所示:

  你好

  这是一个

  文件

  在这里,文档可能看起来像一个奇怪的功能,但它们非常强大,因为它允许我们调用交互式程序,如编辑器,并为它们提供一些预定义的输入。然而,他们最常用的地方是从脚本内部输出大量文本,就像我们之前看到的那样,从而避免在每一行中使用echo命令。我们用了!标出每一行的标记,以确保不会造成混淆。

  如果我们希望以预定义的方式处理文件中的一些行,我们可以使用ed编辑器,并在Shell脚本中使用here document来传递编辑过的命令。

  假设有一个名为a_text_file的文件,它包含以下几行:

  那是一号线

  那是2号线

  那是3号线

  那是4号线

  我们可以使用以下脚本进行处理:

  #!/bin/sh

  ed a_text_file!放克斯特夫!

  三

  d。/$s/is/was/

  w

  q

  !放克斯特夫!

  出口0

  运行该脚本后,该文件的内容如下:

  那是一号线

  那是2号线

  那是4号线

  工作原理:

  这个Shell脚本简单地调用ed编辑器,然后将一些要执行的操作命令传递给ed编辑器。这些命令将移动到第三行,删除这一行,然后用当前行中的内容替换它。ed命令是从当前脚本中的here文档获得的,即在!放克斯特夫!各部分之间。

  这里需要注意的一点是,我们使用/转义了$。

  调试脚本

  调试脚本非常容易,但是没有其他特殊的工具来帮助我们调试。这里我们就简单解释一下一些常用的方法。

  当错误发生时,Shell通常会打印出包含错误内容的行号。如果错误没有立即显示,我们可以添加另一个echo语句来显示变量内容,并简单地将其输入到交互式Shell中来测试代码片段。

  因为脚本是解释的,所以在修改和重试Shell时没有编译的操作。跟踪更复杂错误的主要方法是设置各种Shell选项。为此,我们可以在调用脚本后使用命令行选项或设置命令。以下是一些常用的选项:

  命令行选项集选项描述

  Sh -n脚本set -o noexec只检查语法错误,不执行命令。

  集合n

  Sh -v脚本set -o verbose在运行命令之前打印该命令。

  set -v

  Sh -x脚本set -o xtrace在命令执行后打印该命令。

  set -x

  使用未定义的变量时,Set -o nounset会给出一个错误消息。

  遇到错误退出

  我们可以设置打开标签选项,使用-o,或者关闭并使用o,就像使用缩写版本一样。我们可以使用Xrace选项来执行简单的跟踪。作为初始检查,我们可以使用command选项,但是在最终测试中,我们可以将Xrace标记添加到将出现在脚本中的问题的代码中。跟踪执行将使Shell在执行Shell脚本中的每一行命令之前打印出变量的扩展名。

  我们可以使用以下命令打开xtrace:

  xtrace套装

  我们也可以用以下命令关闭xtrace:

  一套xtrace

  扩展的层次结构由每行开头的编号表示(默认情况下)。我们可以通过在Shell配置文件中设置Shell变量PS4的值,将更改为更有意义的值。

  在Shell中,我们还会发现,我们可以通过获取退出信号来获取一个程序的状态。

  “陷阱”回显退出:关键变量=$critical_variable“退出

  进入图形对话框实用程序。

  在结束对Shell脚本的讨论之前,我们需要讨论一个特性。虽然严格来说它不是Shell的一部分,但是对于Shell程序来说它是相当有用的,所以我们将在这里讨论它。如果我们知道我们的脚本程序只在Linux文本下运行,那么我们就可以有一个简洁的方法来突出我们脚本的特点,那就是使用对话框命令。这个命令将使用文本的模式和颜色,但它看起来仍然像是一个图形界面。

  对话框非常简单。它只是一个具有各种参数和变量的程序,并允许我们显示各种类型的图形框。所显示的范围仅仅是用于输入或甚至菜单选择的具有是/否的框。这个程序通常在用户对输入进行分类时返回,返回的结果可以通过返回的状态获得,也可以通过标准错误流检索输入的文本获得。

  在开始更详细的解释之前,我们先来看一个非常简单的对话框操作。我们可以直接在命令行上使用dialog,这样可以很好地显示原型,所以我们首先创建一个简单的消息框来显示传统的第一个程序:

  对话框- msgbox "Hello World" 9 18

  这将在屏幕上显示一个图形信息框,只是一个确定对话框。

  现在我们可以看到对话框是多么简单。在这里,我们可以查看一些更详细的选项:

  下表列出了我们可以创建的主要对话框。

  选择对话框-清单允许我们显示项目列表,每个项目都可以单独选择。

  信息对话框——一个简单的对话框,infobox可以立即返回,而无需清除屏幕。

  inputbox允许用户输入文本。

  菜单对话框-菜单允许用户从列表项中进行单项选择。

  信息对话框- msgbox向用户显示一个带有“确定”按钮的信息框。

  Radio对话框- raidolist允许用户从列表中选择一项。

  textbox允许我们在滚动框中显示一个文件。

  是/否对话框-是/否允许我们提出一个问题,并允许用户选择是或否。

  还有其他类型的对话框可以使用。如果我们想知道更多关于一些不常见的对话框,像以前一样,我们可以从手册页中获得更详细的描述。

  要获得允许我们输入文本的任何对话框的输出或选择,我们需要获得错误流。通常,我们将它们重定向到一个临时文件,以便以后处理。要获得Yes/No类型的结果,我们只需要查看返回代码。与其他程序类似,它在成功时返回0(例如,是选择),在失败时返回1。

  -清单文本高度宽度列表-高度[标签文本状态].

  -信息框文本高度宽度

  - inputbox文本高度宽度[初始字符串]

  -菜单文本高度宽度菜单-高度[标签项目].

  - msgbox文本高度宽度

  -放射科医师文本高度宽度列表-高度[标签文本状态].

  -文本框文件名高度宽度

  -是否文本高度宽度

  此外,所有对话框都会有一些选项。这里不会列出所有的选项,但是要注意其中的两个:- title,允许我们为对话框指定一个标题,- clear,用来清空屏幕。我们可以查看手册页了解更详细的内容。

  让我们从一个简单完整的例子开始。一旦我们理解了这个例子,其他的一切就简单了。本示例将创建一个对话框,用于选择列表类型,标题为“检查我”,描述为“选择编号”。这个列表对话框将有15个字符高,25个字符宽,每个选项有3个字符高。最后,我们显示这些内容并设置默认的开关选项。

  对话框-标题“检查我”-清单“挑选号码”15 25 3 1“一”“关”2“二”“开”3“三”“关”

  工作原理:

  在这个例子中,参数- checklist告诉我们创建一个checklist类型的对话框。我们使用- title选项设置这个对话框的标题来检查我,接下来的参数是提示信息,这里设置为Pick Numbers。

  我们的下一个操作是设置对话框的大小。这里,我们将其设置为15行高,25行宽,另外3行将用于显示菜单。这不是一个好的尺寸,但它告诉我们如何布局。

  也许这个选项看起来有点奇怪,但是我们要记住的是每个菜单选项都有三个值:

  标签、文本和状态。

  于是我们将第一项的标签设置为1,显示的文字为‘one’,状态为‘on’。我们可以据此设定未来的选项。

  很简单,不是吗?只要我们在命令行上尝试一些命令,就可以看到这个命令是多么容易使用。

  为了在程序中设置这样的对话框,我们需要能够访问用户输入的结果。也挺容易的。我们只需要通过简单的文本输入重定向错误流或者检查环境变量$?这是我们在前面的命令行中调用的返回状态。

  比如下面这个例子:

  #!/bin/sh

  #问一些问题并收集答案

  对话框-标题“问卷”- msgbox“欢迎参加我的简单调查”9 18

  这里我们只是通过一个简单的对话框告诉用户发生了什么,不需要得到用户输入的结果,所以相当简单。

  我们可以改进这个程序:

  对话-标题“确认”-是否“你愿意参加吗?”9 18

  如果[ $?=0 ];然后

  对话框-信息框“无论如何感谢您”5 20

  睡眠2

  对话框-清除

  出口0

  船方不负担装货费用

  现在,我们通过使用一个简单的是/否对话框来询问用户是否进行处理。我们使用环境变量$?以检查用户是否选择了是或否。如果用户不想处理它,我们将使用一个简单的信息对话框,在退出之前不需要用户输入。

  对话框-标题“问卷”-输入框“请输入您的姓名”9 30 2 _1.txt

  Q_NAME=$(cat _1.txt)

  现在我们使用一个输入对话框来询问用户名。我们将标准错误流2重定向到一个临时文件_1.txt,这样我们就可以使用变量Q_NAME进行处理。

  对话菜单“$Q_NAME,你最喜欢什么音乐?”15 30 4 1“古典”2

  "爵士" 3 "国家" 4 "其他" 2 _1.txt

  Q_MUSIC=$(cat _1.txt)

  现在我们展示一个有四个不同选项的菜单。这里,我们还将重定向标准错误流式传输到一个临时文件,并将其加载到一个变量中。

  if[" $ Q _ MUSIC "==" 1 "];然后

  对话框- msgbox“好选择!”12 25

  船方不负担装货费用

  如果用户选择了菜单选项1,它将被存储在一个临时文件_1.txt中,这样我们就可以把结果取出来放在一个变量Q_MUSIC中,这样我们就可以检查结果了。

  睡眠5

  对话框-清除

  出口0

  最后,我们清除最后一个对话框并退出程序。

  现在,如果我们只需要使用Linux文本接口从一个Shell脚本编写简单的GUI程序,就可以使用这种方法。

  结合

  现在我们已经看到了Shell作为一种编程语言的主要特性,我们可以结合我们所学的来编写一个简单的程序。

shell here文档,here are shells