Linux Bash语法:&&,\和-的含义


14

bash命令末尾的“ &&”,“ \”和“ -”是什么意思?

特别是,我遇到了以下几行组合,这些行应该将公共密钥添加到Ubuntu的aptitude软件包管理器中,这些字符是用来做什么的?

    gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
    gpg --export --armor 26C2E075 | sudo apt键添加-&& \
    sudo apt-get更新

“ /”与“ \”不相同
Thomas

托马斯(Thomas):修正其职位
凯尔·布​​兰特

此处不需要使用反斜杠,因为&&也足以表示行继续。但是,使用反斜杠有助于提高可读性。
暂停,直到另行通知。

Answers:


37

“ &&”用于将命令链接在一起,以便在且仅当前一个命令无错误退出(或更准确地说,返回码为0退出)时,才运行下一个命令。

在行尾单独使用“ \”是将行连接在一起的一种方式。所以下面两行:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
gpg --export --armor 26C2E075

处理的方式与该行被写为单行的方式完全相同:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && gpg --export --armor 26C2E075

“-”是命令行参数,没有特定的bash函数。确切的处理方式取决于正在运行的命令(在本例中为apt-key)。根据上下文,它通常用于指示“ 从stdin而不是从文件中读取数据 ”,或“ 将行的其余部分作为数据而不是命令行参数进行处理 ”。


5
在这种情况下,“-”不是sudo的参数,而是“ apt-key”的参数,这意味着“ apt-key”使用的是通过管道('|')到达其stdin的数据,而不是密钥文件。作为关键。“ gpg --export”选项没有'--output a_file_name.key'的输出,而是通过管道('|')将新的密钥从gpg stdout中推出,到达'apt-key'Easy的stdin: )
edomaur

2
哎呀 这就是我在半睡时回答问题的结果。固定。
goldPseudo

7
&& == if the first command succeeded, run the next one
\ == the next line is part of the first line, not two seperate lines
- == read the input from stdin (console)

6

&&是逻辑AND:
&&是表示逻辑AND的一种方式,这意味着仅当表达式的两面都为真时,整个表达式才为True。从逻辑上说,只有P和Q都为真时,整个语句(P&Q)才为真。

结果,计算机通常将P&Q视为短路评估。如此以来,整个语句只会是TRUE,如果P和Q是真实的,那么,如果P是假的,语句Q不是评估。基本上,计算机是惰性的(高效的),并且如果计算机也没有,则不必理会Q。逻辑或也是如此,请参阅上一个链接。

Bash中&&的三个上下文:

1)将短路评估与命令的退出状态一起使用:
每个命令都有退出状态。如果命令有错误,则退出状态为非零。因此,如果退出状态为非零,并且&&用于将命令链接到一条语句中,则如果较早的命令的退出状态不为0(正确),则不会评估(执行)后面的命令。这是由于短路评估。因此,如果您有:

P && Q

如果P不为真,则Q将不会执行(如果P以0以外的任何状态退出,则它不为真)。与以下内容相同:

./configure && make

如果configure出错,则不会执行make。因此,基本上,然后最终成为if语句的一种写入方式:

if ./configure ; then
   make
fi

请记住,在大多数情况下,0为假,但在退出状态时为0。

2)&&可以在Bash的内置[[]]测试命令中使用:

&&也可以在bash [[]]的内置测试命令内部使用,以类似于组合命令的方式组合表达式。仅当&&的两个操作数(面)都为true时,整个测试操作才为true,例如:

if [[ ( $a -gt 2 ) && ( $a -lt 5 ) ]]; then ... 

可以说$ a是2到5之间的整数(不包括2到5)。

3)算术评估:

最后,&&可在逻辑运算中用作逻辑AND。如果以下两个数字(逻辑与)都不为零,则返回0,否则返回1:

kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0

@Kyle:&&在逻辑表达式之外使用的是“ AND控制运算符”,行为相似但在技术上有所不同
drAlberT

不要听从您的评论,在逻辑表达式之外您是什么意思?
凯尔·布​​兰特

我的意思是在表达式中,&&控制运算符假定“逻辑与”的均值,否则仅是“与”。它是列表中使用的“ AND控制运算符”。在表达式中的算术扩展上下文中使用逻辑运算符。
drAlberT

在该if [./configure]示例中,您应该删除括号。正确的是if ./configure; then make...
Juliano,

朱莉安娜(Juliano),好收获,将更新。AlberT,除了手册页给它的术语有什么区别?
凯尔·布​​兰特

3

我认为您最好对“真实”的含义进行解释,暗示是另一回事:)

  • &&是“ AND”控制运算符。来自bash man
    控制运算符&&和|| 分别表示AND列表和OR列表。
    AND清单的格式  
        command1 && command2     
    仅当command1返回退出状态为零时,才能执行command2。
    [..切..]
    AND和OR列表的返回状态是最后一条命令的退出状态
    在列表中执行。
    
    一个控制操作
    执行控制功能的令牌。它是以下符号之一:
        || &&&; ;; ()|
    
  • \是“ 转义字符 ”,它是bash中可用的三种引用机制之一:
    报价
       引用用于将某些字符或单词的特殊含义删除。
    [..切..]
       共有三种报价机制:转义符,单引号和双引号。
       不带引号的反斜杠(\)是转义字符。它会保留下一个字符的字面值,但除外。如果出现一个\对,并且反斜杠本身未加引号,则\被视为行的延续(即,它已从输入流中删除并被有效忽略)。
    [..切..]
    仅当反斜杠后面跟随以下字符之一时,才保留其特殊含义:$,`,“,\或。
    
    这意味着,如果在行的末尾添加转义字符(“ \”),则实际上是在转义紧随其后的新行字符(RETURN字符),从而具有“继续行”的作用。其他人已经在他们的答案中解释了
  • 一些命令将破折号“ - ”作为参数接受,是约定,而不是shell特殊的char或运算符。正如其他人已经指出的那样,它是标准I / O流的一种位置标记。根据我们引用的程序,它可能会保留为stdin(标准输入)或stdout(标准输出)。

我的2美分


1
可能是tl; dr的情况。粘贴巨大的联机帮助页(可能会很启发)可能会吓倒OP。
rodjek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.