返回顶部
首页 > 资讯 > 精选 >Bash的语法和工具都有哪些
  • 305
分享到

Bash的语法和工具都有哪些

2023-06-05 17:06:12 305人浏览 薄情痞子
摘要

本篇文章为大家展示了Bash的语法和工具都有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的。每当用户或者系统管理员将命令

本篇文章为大家展示了Bash的语法和工具都有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的。每当用户或者系统管理员将命令输入系统的时候,Linux 的 shell 解释器就会把这些命令转换成操作系统可以理解的形式。而执行结果返回 shell 程序后,它会将结果输出到 STDOUT(标准输出),默认情况下,这些结果会显示在你的终端。所有我熟悉的 shell 同时也是一门编程语言。

Bash 是个功能强大的 shell,包含众多便捷特性,比如:tab 补全、命令回溯和再编辑、别名等。它的命令行默认编辑模式是 EMacs,但是我最喜欢的 Bash 特性之一是我可以将其更改为 Vi 模式,以使用那些储存在我肌肉记忆中的的编辑命令。

然而,如果你把 Bash 当作单纯的 shell 来用,则无法体验它的真实能力。我在设计一套包含三卷的 linux 自学课程时(这个系列的文章正是基于此课程),了解到许多 Bash 的知识,这些是我在过去 20 年的 Linux 工作经验中所没有掌握的,其中的一些知识就是关于 Bash 的编程用法。不得不说,Bash 是一门强大的编程语言,是一个能够同时用于命令行和 shell 脚本的完美设计。

Shell

Bash 是 Bourne Again Shell 的缩写,因为 Bash shell 是 基于 更早的 Bourne shell,后者是 Steven Bourne 在 1977 年开发的。另外还有很多其他的 shell 可以使用,但下面四个是我经常见到的:

  1. csh:C shell 适合那些习惯了 C 语言语法的开发者。


  2. ksh:Korn shell,由 David Korn 开发,在 Unix 用户中更流行。


  3. tcsh:一个 csh 的变种,增加了一些易用性。


  4. zsh:Z shell,集成了许多其他流行 shell 的特性。

所有 shell 都有内置命令,用以补充或替代核心工具集。打开 shell 的 man 说明页,找到“BUILT-INS”那一段,可以查看都有哪些内置命令。

每种 shell 都有它自己的特性和语法风格。我用过 csh、ksh 和 zsh,但我还是更喜欢 Bash。你可以多试几个,寻找更适合你的 shell,尽管这可能需要花些功夫。但幸运的是,切换不同 shell 很简单。

所有这些 shell 既是编程语言又是命令解释器。下面我们来快速浏览一下 Bash 中集成的编程结构和工具。

作为编程语言的 Bash

大多数场景下,系统管理员都会使用 Bash 来发送简单明了的命令。但 Bash 不仅可以输入单条命令,很多系统管理员可以编写简单的命令行程序来执行一系列任务,这些程序可以作为通用工具,能节省时间和精力。

编写 CLI 程序的目的是要提高效率(做一个“懒惰的”系统管理员)。在 CLI 程序中,你可以用特定顺序列出若干命令,逐条执行。这样你就不用盯着显示屏,等待一条命令执行完,再输入另一条,省下来的时间就可以去做其他事情了。

什么是“程序”?

自由在线计算机词典(FOLDOC)对于程序的定义是:“由计算机执行的指令,而不是运行它们的物理硬件。”普林斯顿大学的 WordNet 将程序定义为:“……计算机可以理解并执行的一系列指令……”维基百科上也有一条不错的关于计算机程序的条目。

总结下,程序由一条或多条指令组成,目的是完成一个具体的相关任务。对于系统管理员而言,一段程序通常由一系列的 shell 命令构成。Linux 下所有的 shell (至少我所熟知的)都有基本的编程功能,Bash 作为大多数 linux 发行版的默认 shell,也不例外。

本系列用 Bash 举例(因为它无处不在),假如你使用一个不同的 shell 也没关系,尽管结构和语法有所不同,但编程思想是相通的。有些 shell 支持某种特性而其他 shell 则不支持,但它们都提供编程功能。Shell 程序可以被存在一个文件中被反复使用,或者在需要的时候才创建它们。

简单 CLI 程序

最简单的命令行程序只有一或两条语句,它们可能相关,也可能无关,在按回车键之前被输入到命令行。程序中的第二条语句(如果有的话)可能取决于第一条语句的操作,但也不是必须的。

这里需要特别讲解一个标点符号。当你在命令行输入一条命令,按下回车键的时候,其实在命令的末尾有一个隐含的分号(;)。当一段 CLI shell 程序在命令行中被串起来作为单行指令使用时,必须使用分号来终结每个语句并将其与下一条语句分开。但 CLI shell 程序中的最后一条语句可以使用显式或隐式的分号。

一些基本语法

下面的例子会阐明这一语法规则。这段程序由单条命令组成,还有一个显式的终止符:

[student@studentvm1 ~]$ echo "Hello world." ;Hello world.

看起来不像一个程序,但它确是我学习每个新编程语言时写下的第一个程序。不同语言可能语法不同,但输出结果是一样的。

让我们扩展一下这段微不足道却又无所不在的代码。你的结果可能与我的有所不同,因为我的家目录有点乱,而你可能是在 GUI 桌面中第一次登录账号。

[student@studentvm1 ~]$ echo "My home directory." ; ls ;My home directory.chapter25   TestFile1.Linux  dmesg2.txt  Downloads  newfile.txt  softlink1  testdir6chapter26   TestFile1.mac    dmesg3.txt  file005    Pictures     Templates  testdirTestFile1      Desktop       dmesg.txt   link3      Public       testdir    VideosTestFile1.dos  dmesg1.txt    Documents   Music      random.txt   testdir1

现在是不是更明显了。结果是相关的,但是两条语句彼此独立。你可能注意到我喜欢在分号前后多输入一个空格,这样会让代码的可读性更好。让我们再运行一遍这段程序,这次不要带结尾的分号:

[student@studentvm1 ~]$ echo "My home directory." ; ls

输出结果没有区别。

关于变量

像所有其他编程语言一样,Bash 支持变量。变量是个象征性的名字,它指向内存中的某个位置,那里存着对应的值。变量的值是可以改变的,所以它叫“变~量”。

Bash 不像 C 之类的语言,需要强制指定变量类型,比如:整型、浮点型或字符型。在 Bash 中,所有变量都是字符串。整数型的变量可以被用于整数运算,这是 Bash 唯一能够处理的数学类型。更复杂的运算则需要借助 bc 这样的命令,可以被用在命令行编程或者脚本中。

变量的值是被预先分配好的,这些值可以用在命令行编程或者脚本中。可以通过变量名字给其赋值,但是不能使用 $ 符开头。比如,VAR=10 这样会把 VAR 的值设为 10。要打印变量的值,你可以使用语句 echo $VAR。变量名必须以文本(即非数字)开始。

Bash 会保存已经定义好的变量,直到它们被取消掉。

下面这个例子,在变量被赋值前,它的值是空(null)。然后给它赋值并打印出来,检验一下。你可以在同一行 CLI 程序里完成它:

[student@studentvm1 ~]$ echo $MyVar ; MyVar="Hello World" ; echo $MyVar ; Hello World[student@studentvm1 ~]$

注意:变量赋值的语法非常严格,等号(=)两边不能有空格。

那个空行表明了 MyVar 的初始值为空。变量的赋值和改值方法都一样,这个例子展示了原始值和新的值。

正如之前说的,Bash 支持整数运算,当你想计算一个数组中的某个元素的位置,或者做些简单的算术运算,这还是挺有帮助的。然而,这种方法并不适合科学计算,或是某些需要小数运算的场景,比如财务统计。这些场景有其它更好的工具可以应对。

下面是个简单的算术题:

[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1*Var2))"Result = 63

好像没啥问题,但如果运算结果是浮点数会发生什么呢?

[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1/Var2))"Result = 0[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var2/Var1))"Result = 1[student@studentvm1 ~]$

结果会被取整。请注意运算被包含在 echo 语句之中,其实计算在 echo 命令结束前就已经完成了,原因是 Bash 的内部优先级。想要了解详情的话,可以在 Bash 的 man 页面中搜索 “precedence”。

控制运算符

Shell 的控制运算符是一种语法运算符,可以轻松地创建一些有趣的命令行程序。在命令行上按顺序将几个命令串在一起,就变成了最简单的 CLI 程序:

command1 ; command2 ; command3 ; command4 ; . . . ; etc. ;

只要不出错,这些命令都能顺利执行。但假如出错了怎么办?你可以预设好应对出错的办法,这就要用到 Bash 内置的控制运算符, && 和 ||。这两种运算符提供了流程控制功能,使你能改变代码执行的顺序。分号也可以被看做是一种 Bash 运算符,预示着新一行的开始。

&& 运算符提供了如下简单逻辑,“如果 command1 执行成功,那么接着执行 command2。如果 command1 失败,就跳过 command2。”语法如下:

command1 && command2

现在,让我们用命令来创建一个新的目录,如果成功的话,就把它切换为当前目录。确保你的家目录(~)是当前目录,先尝试在 /root 目录下创建,你应该没有权限:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir/ && cd $Dirmkdir: cannot create directory '/root/testdir/': Permission denied[student@studentvm1 ~]$

上面的报错信息是由 mkdir 命令抛出的,因为创建目录失败了。&& 运算符收到了非零的返回码,所以 cd 命令就被跳过,前者阻止后者继续运行,因为创建目录失败了。这种控制流程可以阻止后面的错误累积,避免引发更严重的问题。是时候讲点更复杂的逻辑了。

当一段程序的返回码大于零时,使用 || 运算符可以让你在后面接着执行另一段程序。简单语法如下:

command1 || command2

解读一下,“假如 command1 失败,执行 command2”。隐藏的逻辑是,如果 command1 成功,跳过 command2。下面实践一下,仍然是创建新目录:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir || echo "$Dir was not created."mkdir: cannot create directory '/root/testdir': Permission denied/root/testdir was not created.[student@studentvm1 ~]$

正如预期,因为目录无法创建,第一条命令失败了,于是第二条命令被执行。

把 && 和 || 两种运算符结合起来才能发挥它们的最大功效。请看下面例子中的流程控制方法:

前置 commands ; command1 && command2 || command3 ; 跟随 commands

语法解释:“假如 command1 退出时返回码为零,就执行 command2,否则执行 command3。”用具体代码试试:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."mkdir: cannot create directory '/root/testdir': Permission denied/root/testdir was not created.[student@studentvm1 ~]$

现在我们再试一次,用你的家目录替换 /root 目录,你将会有权限创建这个目录了:

[student@studentvm1 ~]$ Dir=~/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."[student@studentvm1 testdir]$

像 command1 && command2 这样的控制语句能够运行的原因是,每条命令执行完毕时都会给 shell 发送一个返回码,用来表示它执行成功与否。默认情况下,返回码为 0 表示成功,其他任何正值表示失败。一些系统管理员使用的工具用值为 1 的返回码来表示失败,但其他很多程序使用别的数字来表示失败。

Bash 的内置变量 $? 可以显示上一条命令的返回码,可以在脚本或者命令行中非常方便地检查它。要查看返回码,让我们从运行一条简单的命令开始,返回码的结果总是上一条命令给出的。

[student@studentvm1 testdir]$ ll ; echo "RC = $?"total 1264drwxrwxr-x  2 student student   4096 Mar  2 08:21 chapter25drwxrwxr-x  2 student student   4096 Mar 21 15:27 chapter26-rwxr-xr-x  1 student student     92 Mar 20 15:53 TestFile1drwxrwxr-x. 2 student student 663552 Feb 21 14:12 testdirdrwxr-xr-x. 2 student student   4096 Dec 22 13:15 VideosRC = 0[student@studentvm1 testdir]$

在这个例子中,返回码为零,意味着命令执行成功了。现在对 root 的家目录测试一下,你应该没有权限:

[student@studentvm1 testdir]$ ll /root ; echo "RC = $?"ls: cannot open directory '/root': Permission deniedRC = 2[student@studentvm1 testdir]$

返回码是 2,表明非 root 用户没有权限进入这个目录。你可以利用这些返回码,用控制运算符来改变程序执行的顺序。

将 Bash 看作一门编程语言,并从这个视角介绍了它的简单语法和基础工具。我们学习了如何将数据输出到 STDOUT,怎样使用变量和控制运算符。

上述内容就是Bash的语法和工具都有哪些,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网精选频道。

--结束END--

本文标题: Bash的语法和工具都有哪些

本文链接: https://lsjlt.com/news/243895.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Bash的语法和工具都有哪些
    本篇文章为大家展示了Bash的语法和工具都有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的。每当用户或者系统管理员将命令...
    99+
    2023-06-05
  • Linux Bash编程语法都有哪些
    这期内容当中小编将会给大家带来有关Linux Bash编程语法都有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在Linux学习过程中,我们无可避免的会碰到一个既让人喜欢,又令人头疼的神奇的东西&am...
    99+
    2023-06-16
  • mongodb连接工具都有哪些
    mongodb连接工具有:1、Robo 3T管理工具,它前身是Robomongo,支持Windows、MacOS和Linux系统;2、Navicat for MongoDB是一种收费数据库管理工具;3、MongoDB Compass 社区版...
    99+
    2024-04-02
  • Python爬虫工具都有哪些
    这篇文章将为大家详细讲解有关Python爬虫工具都有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。与爬虫相关的常用模块列表。网络通用urllib -网络库(stdlib)。re...
    99+
    2023-06-02
  • vue的开发工具都有哪些呢
    vue的开发工具都有哪些呢,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。vue开发工具有:1、Vue CLI;2、Vue Press;3、Vuex;4、Nuxt;5、Vueti...
    99+
    2023-06-25
  • JavaScript模块化方案和工具都有哪些
    这篇文章给大家介绍JavaScript模块化方案和工具都有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。模块化是大型前端项目的必备要素。JavaScript 从诞生至今,出现过各种...
    99+
    2024-04-02
  • 网页设计工具和资源都有哪些
    本篇文章给大家分享的是有关网页设计工具和资源都有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。网页设计师有福利了,下面给大家介绍10款超有...
    99+
    2024-04-02
  • MySQL优化工具AWR都有哪些
    本篇文章为大家展示了MySQL优化工具AWR都有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。对于正在运行的mysql,性能如何,...
    99+
    2024-04-02
  • .NET开发相关工具都有哪些
    本篇文章为大家展示了.NET开发相关工具都有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。本文向你介绍 8 款跟 .NET 开发相关的一些工具。1) Open Source &ndash...
    99+
    2023-06-17
  • MySQL数据库的建模工具都有哪些
    这篇文章将为大家详细讲解有关MySQL数据库的建模工具都有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。数据库建模和设计是软件开发过程中必不可少的步骤,一个良好的建模工具可以帮助我们简单...
    99+
    2023-06-19
  • 优秀的Web开发辅助工具都有哪些
    本篇文章为大家展示了优秀的Web开发辅助工具都有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。优秀的工具,可以使你的开发工作事半功倍,帮助你创建出高品质的Web...
    99+
    2024-04-02
  • 简单易于操作的Python 工具都有哪些
    这期内容当中小编将会给大家带来有关简单易于操作的Python 工具都有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python语言是一种简单易学,功能强大的解释型编程语言,它有简洁明了的语法,高效率...
    99+
    2023-06-17
  • .Net运算符和基础语句具体都有哪些
    本篇文章给大家分享的是有关.Net运算符和基础语句具体都有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 .Net运算符运算符C#  提供大量运算符,这...
    99+
    2023-06-17
  • 实时索引的必备工具:Java 和 Bash 的使用技巧有哪些?
    实时索引是一种常见的搜索引擎功能,可以让用户在搜索时实时看到最新的结果。为了实现这一功能,我们需要使用一些特定的工具。本文将讨论实时索引的必备工具,主要包括Java和Bash的使用技巧。 一、Java Java是一个跨平台的编程语言,被广泛...
    99+
    2023-08-26
    bash 索引 实时
  • 有哪些go语言开发工具
    go语言开发工具:1、GoLand;2、Visual Studio Code;3、Sublime Text;4、Vim;5、LiteIDE;6、GoClipse;7、Delve;8、GoDoc;9、GoCodify;10、GoSublime...
    99+
    2023-12-11
    go语言 开发工具
  • sql语句都有哪些
    这篇文章将为大家详细讲解有关sql语句都有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Windows中运行cmd的Sqlplus中设置每行显示的数据长...
    99+
    2024-04-02
  • go语言都有哪些
    go语言都有高效的并发编程、快速编译、内存管理、强大的标准库、静态类型和类型推断、跨平台支持、开源社区支持等特点。详细介绍:1、高效的并发编程,Go语言内置了轻量级的协程和通道,使并发编程变得简单且高效;2、快速编译,Go语言的编译速度非常...
    99+
    2023-08-03
  • Linux命令具体都有有哪些
    这篇文章主要为大家分析了Linux命令具体都有有哪些的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Linux命令具体都有有哪些”的知识吧。Linux是一套免...
    99+
    2023-06-28
  • NETCA和NETMGR工具的区别有哪些
    这篇文章主要介绍NETCA和NETMGR工具的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! netca能做的,netmgr都能做到,netmg...
    99+
    2024-04-02
  • c语言反编译工具有哪些
    以下是一些常见的C语言反编译工具:1. IDA Pro:一款功能强大的静态反汇编和调试工具,可以用于反编译C语言程序。2. Ghid...
    99+
    2023-09-29
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作