Bash中的逻辑和(\u0026)

在Bash中,您可以将用作AND运算符。
保罗布朗
可能有人觉得两篇文章意思差不多,其实不然。虽然第一篇文章讨论了如何在命令末尾使用它将命令转到后台,然后解剖了进程管理,但是第二篇文章将被视为引用文件描述符的方法。这些文章让我们知道,当与and结合使用时,可以将输入或输出引导到其他地方。
但是我们还没有接触到AND运算符。那么,让我们来看看。
是位运算符。如果你对二进制数运算非常熟悉,你一定听说过AND和OR。这些是按位操作,对二进制数的每一位进行操作。在Bash中,使用作为AND运算符,使用|作为or运算符:
并且:
0 0=0
0 1=0
1 0=0
1 1=1
或者:
0 | 0=0
0 | 1=1
1 | 0=1
1 | 1=1
您可以通过和任意两个数字并使用echo输出结果:
$ echo $((2 ^ 3))# 00000010和00000011=00000010
2
$ echo $(( 120 97 )) # 01111000和01100001=01100000
96
或者(|)是一样的:
$ echo $(( 2 | 3 )) # 00000010或00000011=00000011

$ echo $(( 120 | 97 )) # 01111000或01100001=01111001
121
描述:
使用((.))告诉Bash双括号之间的内容是某种算术或逻辑运算。((2 ^ 2))、((5% 2 )) (%是模运算符)、(((5% 2) 1))(等于3)都可以。像变量一样,使用$提取值以便使用。空格没有作用:((2 ^ 3))相当于((2 ^ 3))和((2 ^ 3))。Bash只能对整数进行操作。试试这个:((5/2)),你会得到2;或者这样((2.5 7)),但是你会得到一个错误。然后,在位运算中使用整数以外的任何东西(这就是我们现在讨论的)通常是你不应该做的。提示:如果您想知道十进制数在二进制中是什么样子,您可以使用bc,它是大多数Linux发行版中预装的命令行计算器。例如:
BC \ ‘ o base=2;97\’
这个操作会将97转换成十进制(obase中的O代表“输出”,即“输出”)。
BC \ ‘ ibase=2;11001011\’
该操作会将11001011转换为十进制(ibase中的I代表“输入”,即“输入”)。
是一个逻辑运算符。尽管Bash的操作符使用了与它的位表达式相同的逻辑原理,但它只能呈现两种结果:1(“真值”)和0(“假值”)。对于Bash来说,除0以外的任何数字都是“真值”,任何等于0的数字都是“假值”。什么是“假值”,同时又不是数字?
$ echo $(( 4 5 )) #两个非零数字,其中两个为真=真
一个
$ echo $(( 0 5 )) #一个为零,另一个为false=false
0
$ echo $(( b 5 )) #其中一个不是数字,另一个是false=false
0
类似于,或者对应于||,用法正如你所想。
以上都很简单…直到它被用在命令的退出状态。
是命令退出状态的逻辑运算符。正如我们在上一篇文章中看到的,当命令运行时,它将输出一条错误消息。更重要的是,对于今天的讨论,它还会在最后输出一个数字。这个号码叫做“返回码”。如果为0,则表示命令在执行过程中没有遇到任何问题。如果是其他任何数字,即使命令完成了,也说明有问题。
所以0表示好,其他任何数字表示有问题,在返回代码的上下文中,0表示“真”,其他任何数字表示“假”。是啊!这与众所周知的逻辑运算完全相反,但你能用这个做什么呢?不同的背景,不同的规则。这种用途很快就会变得明显。
我们继续吧!
返回代码临时存储在一个特殊变量3354是的,我知道:这又是一个令人困惑的选择。但是无论如何,不要忘记我们在关于变量的文章中说过,当我们说你要用$符号来读取变量中的值,这里也是一样的。所以,如果你想知道一个命令运行是否顺畅,你需要在命令结束之后,运行其他命令之前,立即使用$读取变量的值。
尝试以下命令:
$ find /etc -iname \’*。服务\ ‘
find : ‘/etc/audisp/plugins . d ‘ :权限被拒绝
/etc/systemd/system/dbus-org . free desktop . nm-dispatcher . service
/etc/systemd/system/dbus-org . free desktop . modem manager 1 . service
[.]
正如您在上一篇文章中看到的,以普通用户权限运行/etc下的find通常会抛出一个错误,因为它试图读取您无权访问的子目录。
因此,如果您立即执行find.
回声$
…,它会打印1,表示有错误。
(注意:当您在一行中运行echo $两次时,您将得到一个0。这是因为$将包含第一个echo $的返回代码,并且该命令将被成功执行。所以学习如何使用$的第一课是:单独执行$或者把它保存在另一个安全的地方,比如变量,否则你会很快丢失它。)
variable的一个直接用途就是把它合并成一个链式命令列表,这样如果Bash运行这个链式命令时有任何操作失败,后面的命令都会被终止。例如,您可能熟悉构建和编译应用程序源代码的过程。您可以像这样逐个手动运行它们:
$ configure。。
$ make。。
$进行安装。。
你也可以把这三行合并成一行…
$ configure制造;进行安装
.但你必须希望上帝保佑。
为什么这么说?因为你有缺点,比如如果configure失败,Bash还是会尝试执行make和sudo make install——。就算什么都不会做,其实什么都不会装。
更明智的做法是:
$ configure make make安装
这将从每个命令中获取退出代码,并将其用作链式操作的操作数。
但是,没什么好抱怨的。Bash知道如果configure返回非零结果,整个过程将会失败。如果发生这种情况,您不必运行make来检查它的退出代码,因为它无论如何都会失败。因此,它放弃运行make,而只是将非零结果传递给下一个操作。而且,因为configure make传递了一个错误,Bash不必运行make install。这意味着在一长串命令中,你可以用连接它们,一旦它失败,你可以节省时间,因为其他命令会立即被取消。
您可以类似地使用||,或逻辑操作符,这样即使只有一些命令成功执行,Bash也可以运行下一个链接的命令。
考虑到所有这些(以及我们之前讨论过的内容),您现在应该对本文开头出现的命令行有了更清晰的理解:
mkdir test_dir 2/dev/null ||触摸backup/dir/images.txt find。-iname \ ‘ * jpg \ ‘ backup/dir/images . txt
那么,假设你从一个有读写权限的目录运行上面的,它做什么,怎么做?如何避免可能导致执行中断的不合时宜的错误?下周,除了给你这些答案的结果,我们还会讨论括号。不要错过!
https://www.linux.com/blog/learn/2019/2/logical-ampersand-bash via :号
作者:保罗布朗题目:lujun9972译者:zero-MK校对:wxy
本文最初由LCTT编辑,Linux中国很荣幸地发布了它。
点击“了解更多”访问文本中的链接。

其他教程

3D如何做动画(3ds导入3dmax)

2022-8-15 5:10:51

其他教程

暴雪的动画谁做的(暴雪做动画有多用心?200人团队花了2000万美金,做了个3分钟CG!)

2022-8-15 5:12:54

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索