AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 53577
Accepted
Alex
Alex
Asked: 2009-08-13 21:54:29 +0800 CST2009-08-13 21:54:29 +0800 CST 2009-08-13 21:54:29 +0800 CST

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

  • 772

bash 命令末尾的' &&'、' \' 和 ' ' 是什么意思?-

特别是,我遇到了以下应该将公钥添加到 Ubuntu 的 aptitude 包管理器的行组合,这些字符在这里用于什么?

    gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
    gpg --export --armor 26C2E075 | sudo apt-key 添加 - && \
    sudo apt-get 更新
linux
  • 4 4 个回答
  • 54362 Views

4 个回答

  • Voted
  1. Best Answer
    goldPseudo
    2009-08-13T22:06:03+08:002009-08-13T22:06:03+08:00

    “&&”用于将命令链接在一起,以便当且仅当前一个命令没有错误退出(或者更准确地说,以返回码 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)。根据上下文,它通常用于表示“从标准输入而不是从文件中读取数据”,或“将行的其余部分作为数据而不是作为命令行参数处理”。

    • 51
  2. rodjek
    2009-08-13T22:00:59+08:002009-08-13T22:00:59+08:00
    && == 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)
    
    • 12
  3. Kyle Brandt
    2009-08-14T03:48:36+08:002009-08-14T03:48:36+08:00

    && 是逻辑与:
    && 是一种表达逻辑与的方式,这意味着整个表达式只有在两边都为真时才为真。在逻辑上,只有当 P 和 Q 都为真时,整个陈述 (P&Q) 才为真。

    因此,计算机通常将 P&Q 视为短路评估。因此,由于整个语句只有在 P 和 Q 都为真时才为真,所以如果 P 为假,则不评估语句Q。基本上计算机是懒惰的(高效的),如果他们没有 Q,就不会费心评估 Q。这也是逻辑 OR 的 True,请参阅上一个链接。

    Bash 中 && 的三个上下文:

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

    P && Q
    

    如果 P 不为真,则不会执行 Q(如果 P 退出时的状态不是 0,则它不为真)。就像:

    ./configure && make
    

    如果 configure 有错误,make 将不会被执行,这是不正确的。所以基本上, then 最终成为一种写 if then 语句的方式:

    if ./configure ; then
       make
    fi
    

    请记住,在大多数情况下,0 是错误的,但在退出状态时则不然。

    2) && 可用于 Bash 内置的 [[ ]] 测试命令:

    && 也可以在 bash [[ ]] 的内置测试命令中使用,以与组合命令类似的方式组合表达式。只有当 && 的两个操作数(边)都为真时,整个测试操作才会为真,例如:

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

    如果 $a 是 2 和 5 之间的整数(不包括 2 和 5),这是一种说法。

    3)算术评估:

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

    kbrandt@desktop:~/$ echo $((1 & 1))
    1
    kbrandt@desktop:~/$ echo $((0 && 1))
    0
    
    • 6
  4. drAlberT
    2009-08-14T00:52:44+08:002009-08-14T00:52:44+08:00

    我认为您会更好地解释“真实”含义,含义是另一回事:)

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

    我的 2 美分

    • 3

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve