如何在bash脚本中传递字符串引号?

Max*_*cat 1 bash

在命令行上,如果我键入

adb -s "" shell
Run Code Online (Sandbox Code Playgroud)

我有一个外壳,但是如果我尝试在bash中这样做:

#!/bin/bash
ADB_ID=""
adb -s ${ADB_ID} shell
Run Code Online (Sandbox Code Playgroud)

我得到一个错误。我了解它没有传递$ {ADB_ID}的任何内容。我尝试将引号转义,这导致它查找名为“”的设备,这是不正确的。我也尝试过使用单引号和单转义的引号,两者都是错误的。如何在bash脚本中传递等效的命令行?

gle*_*man 6

养成在变量周围(几乎)始终使用双引号的习惯:

adb -s "$ADB_ID" shell
Run Code Online (Sandbox Code Playgroud)

是你想要的。

报价是shell编程是一个讨论很多的话题。除了说:我不会在这里详细介绍:

  • 在将行标记为单词之前,shell使用了某些扩展,包括变量扩展,包括命令及其参数。
  • 外壳使用空格序列分隔单词
  • 如果您没有引用上面的变量,那么shell将看到以下内容:

    adb -s  shell
    
    Run Code Online (Sandbox Code Playgroud)

    并且没有办法知道在“ -s”和“ shell”之间应该有一些东西。
    带引号的外壳会看到

    adb -s "" shell
    
    Run Code Online (Sandbox Code Playgroud)

    很明显,那里有一个零长度的单词。

如需更多研究,https://stackoverflow.com/tags/bash/info是一个不错的起点。

对于此特定问题,BashPitfalls编号为2到5。

  • @Neb在这种情况下,双引号表示“扩展变量引用,但不要弄乱结果”。如果不带引号,则变量的值将被拆分为“单词”(在这种情况下,该值将消失,因为值中包含零个单词),然后将包含可能是通配符的所有单词的每个单词扩展为匹配文件列表。通常,您都不希望使用这两种方法,因此应在变量引用两边加上双引号,以防止出现这种情况。 (2认同)