mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-01-25 23:11:02 +08:00
PRF:20181121 Coupled commands with control operators in Bash.md
@Jamskr
This commit is contained in:
parent
117065b5b0
commit
23a778d8f8
@ -1,10 +1,11 @@
|
||||
Bash 中使用控制运算符连接命令
|
||||
======
|
||||
在命令行中,使用控制运算符为复合命令添加逻辑。
|
||||
|
||||
> 在命令行中,使用控制运算符为复合命令添加逻辑。
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc-lead-yearbook-best-couple.png?itok=a_99oCdE)
|
||||
|
||||
一些简单的复合指令——比如说在一个命令行中连接几个命令——是经常使用的。这些命令使用分号分隔,表示一个命令结束。为了在一个命令行中创建一系列简单的 shell 命令,只需要使用分号把每一条命令分隔开,就像下面这样:
|
||||
经常会使用一些简单的复合指令,比如说在一个命令行中连接几个命令。这些命令使用分号分隔,表示一个命令结束。为了在一个命令行中创建一系列简单的 shell 命令,只需要使用分号把每一条命令分隔开,就像下面这样:
|
||||
|
||||
```
|
||||
command1 ; command2 ; command3 ; command4 ;
|
||||
@ -12,7 +13,7 @@ command1 ; command2 ; command3 ; command4 ;
|
||||
|
||||
最后一个分号你可以不用添加,因为当你按下回车键时就表示一个命令的结束,但是为了和其它的保持一致,还是建议加上比较好。
|
||||
|
||||
所有的命令执行都没有什么问题——只要没有什么意外发生。但是当出问题时到底发生了什么呢?我们可以预测,并且通过 Bash 中内置的 `&&` 和 `||` 运算符跟踪这些错误。这两个控制运算符提供了一些流控制,可以让我们改变代码执行队列的顺序。分号和 **换行符** 也被认为是 Bash 的控制运算符。
|
||||
所有的命令执行都没有什么问题 —— 只要没有什么意外发生。但是当出问题时到底发生了什么呢?我们可以预测,并且通过 Bash 中内置的 `&&` 和 `||` 运算符跟踪这些错误。这两个控制运算符提供了一些流控制,可以让我们改变代码执行队列的顺序。分号和换行符也被认为是 Bash 的控制运算符。
|
||||
|
||||
`&&` 运算符意义简单来说就是“如果 `command1` 执行成功,就接着执行 `command2`。”如果 `command1` 因为任何原因执行失败,那么 `command2` 将不执行。这个语法看下来像这样:
|
||||
|
||||
@ -20,9 +21,9 @@ command1 ; command2 ; command3 ; command4 ;
|
||||
command1 && command2
|
||||
```
|
||||
|
||||
这样写是允许的,因为每一个命令都会返回一个值给 shell 来表示这个命令在执行的过程中是否执行成功或者失败。通常,返回值是 0 表示成功,而一个正数值表示不同种类的错误。有一些系统管理工具仅仅返回一个 1 来表示所有的错误,但是也有很多工具使用其它的正数的返回值来表示各种类型错误。
|
||||
这样写是允许的,因为每一个命令都会返回一个值(RC)给 shell 来表示这个命令在执行的过程中是否执行成功或者失败。通常,返回值是 `0` 表示成功,而一个正数值表示不同种类的错误。有一些系统管理工具仅仅返回一个 `1` 来表示所有的错误,但是也有很多工具使用其它的正数的返回值来表示各种类型错误。
|
||||
|
||||
我们可以很容易的使用脚本, 命令列表中的下一个命令,或者可以直接使用系统管理工具来检查 shell 变量 `$?` 。我们一起来看这些返回值。运行一个简单的命令然后立即检查它的返回值,这个返回值始终是属于最后一个运行的命令。
|
||||
我们可以很容易的使用脚本来检查 shell 变量 `$?`,可以通过命令列表中的下一个命令,或者可以直接使用系统管理工具检查。我们一起来看这些返回值。运行一个简单的命令然后立即检查它的返回值,这个返回值始终是属于最后一个运行的命令。
|
||||
|
||||
```
|
||||
[student@studentvm1 ~]$ ll ; echo "RC = $?"
|
||||
@ -35,7 +36,7 @@ RC = 0
|
||||
[student@studentvm1 ~]$
|
||||
```
|
||||
|
||||
这个返回值是 0,表示这个命令执行成功了。现在尝试使用同样的命令在一些我们没有权限的目录上。
|
||||
这个返回值是 `0`,表示这个命令执行成功了。现在尝试使用同样的命令在一些我们没有权限的目录上。
|
||||
|
||||
```
|
||||
[student@studentvm1 ~]$ ll /root ; echo "RC = $?"
|
||||
@ -44,7 +45,7 @@ RC = 2
|
||||
[student@studentvm1 ~]$
|
||||
```
|
||||
|
||||
这个返回值的含义可以在 [`ls` 命令的 man 页面][1] 中找到。
|
||||
这个返回值的含义可以在 [ls 命令的 man 页面][1] 中找到。
|
||||
|
||||
现在我们来试试 `&&` 这个控制运算符,因为它也可能会被用在一个命令行程序中。我们将从一个简单的示例开始:创建一个新目录,如果创建成功就在这个目录中创建一个文件。
|
||||
|
||||
@ -54,7 +55,7 @@ RC = 2
|
||||
[student@studentvm1 ~]$ cd ; mkdir testdir
|
||||
```
|
||||
|
||||
在 `~/testdir` 中新建一个目录,这也应该是一个空目录,因为是你刚刚创建的,然后创建一个新的,空文件在这个新目录中。下面的命令可以做这些事情。
|
||||
在 `~/testdir` 中新建一个目录,这也应该是一个空目录,因为是你刚刚创建的,然后创建一个新的空文件在这个新目录中。下面的命令可以做这些事情。
|
||||
|
||||
```
|
||||
[student@studentvm1 ~]$ mkdir ~/testdir/testdir2 && touch ~/testdir/testdir2/testfile1
|
||||
@ -64,7 +65,7 @@ total 0
|
||||
[student@studentvm1 ~]$
|
||||
```
|
||||
|
||||
我们看到一切都运行得很好,因为 `testdir` 目录是访问且可写的。然后我们改变 `testdir` 目录的权限,让用户 **student** 不再具有访问的权限。操作如下:
|
||||
我们看到一切都运行得很好,因为 `testdir` 目录是访问且可写的。然后我们改变 `testdir` 目录的权限,让用户 `student` 不再具有访问的权限。操作如下:
|
||||
|
||||
```
|
||||
[student@studentvm1 ~]$ chmod 076 testdir ; ll | grep testdir
|
||||
@ -116,7 +117,7 @@ via: https://opensource.com/article/18/11/control-operators-bash-shell
|
||||
作者:[David Both][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Jamskr](https://github.com/Jamskr)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user