何时在 Ubuntu 命令行中使用单引号或双引号?

何时在 Ubuntu 命令行中使用单引号或双引号?

是否有一个简单的规则来了解何时在 Ubuntu 命令行中使用引号以及何时需要单引号和何时需要双引号?

例如,如何解释这里的区别:

$ echo $'a\naa\nac\nb\ncc\tdd\ne\se'
a
aa
ac
b
cc  dd
e\se
$

$ echo $"a\naa\nac\nb\ncc\tdd\ne\se"
a\naa\nac\nb\ncc\tdd\ne\se
$

答案1

在您的例子中,使用了一种特殊的引用语法,即$'...'and $"..."。看起来这种语法来自 Korn shell 到 Zsh 和 Bash,现在在 POSIX 中(例如,参见http://mywiki.wooledge.org/Bashism)。此语法未在以下问题的答案中提及:命令行上双引号“”、单引号‘’和反引号‘’之间的区别?

此语法的详细信息可以在 bash(1) 手册页中找到:

   Words of the form $'string' are treated specially.  The word 
   expands to string, with backslash-escaped characters replaced as specified 
   by the  ANSI C standard.  Backslash escape sequences, if present, are 
   decoded as follows:
              \a     alert (bell)
              \b     backspace
              \e
              \E     an escape character
              \f     form feed
              \n     new line
              \r     carriage return
              \t     horizontal tab
              \v     vertical tab
              \\     backslash
              \'     single quote
              \"     double quote
              \nnn   the eight-bit character whose value is the octal value 
                     nnn (one to three digits)
              \xHH   the eight-bit character whose value is the hexadecimal 
                     value HH (one or two hex digits)
              \uHHHH the Unicode (ISO/IEC 10646) character whose value is 
                     the hexadecimal value HHHH (one to four hex digits)
              \UHHHHHHHH
                     the Unicode (ISO/IEC 10646) character whose value is the 
                     hexadecimal value HHHHHHHH (one to eight hex digits)
              \cx    a control-x character

       The expanded result is single-quoted, as if the dollar sign had not
       been present.

       A double-quoted string preceded by a dollar sign ($"string") will
       cause the string to be translated according to the current locale.  If 
       the current locale is C or POSIX, the dollar sign is ignored.  If the
       string is translated and replaced, the replacement is double-quoted.

这也意味着变量将在 中扩展$"...",但不会 在 中扩展$'...'。请比较:

$ echo 'I am using\t$SHELL.\n'
I am using\t$SHELL.\n
$ echo $'I am using\t$SHELL.\n'
I am using  $SHELL.

$ echo "I am using\t$SHELL.\n"
I am using\t/bin/bash.\n
$ echo $"I am using\t$SHELL.\n"
I am using\t/bin/bash.\n

在第一个示例中,$SHELL变量和反斜杠转义符均未扩展。在第二个示例中,反斜杠示例已扩展,但变量未扩展。第三个和第四个示例的结果相同:仅扩展了变量。

该表单$'...'可用于将具有元字符(如\t或 )的内容分配\n给变量。但我找不到该表单的应用程序$"..."

答案2

通常,双引号(“”)用于打印任何变量的值,而单引号用于打印精确的字符串。

例如,您有一个foo包含pwd值的变量。

foo=pwd

现在,当你这样做时:-

  • echo "$foo" - 它将打印变量 foo 的值,即 pwd
  • echo '$foo' - 它将打印 $foo (单引号中传递的精确字符串)此外,反引号用于命令行/shell 脚本,通常用于运行存储在变量中的命令。
  • echo `$foo `将打印您的当前目录,即pwd命令的输出。

答案3

$ echo $'a\naa\nac\nb\ncc\tdd\ne\se'
a
aa
ac
b
cc  dd
e\se
$

在上面的例子中,\n代表新行。对于这个语法 $'code\ncode1',终端首先在第一行打印code,在下一行打印code1

因此,在示例中,终端首先开始执行代码。a在第一行打印,然后移动到下一个字符。下一个字符是,\n代表新行。因此它aa在新行中打印。然后 bash 解释器像这样执行。看到此代码后cc\tdd,它会打印cc,并在经过一些空格后打印dd。因为\t代表tab。接下来它会e\se照常打印,因为没有值\s

$ echo $“a\naa\nac\nb\ncc\tdd\ne\se”
\naa\nac\nb\ncc\tdd\ne\se
$

echo $"text".在此 echo 命令中,它将$""按原样显示其中给出的任何内容。它不会解析。

echo $'code'- 它解析代码。

echo $"code"- 如果代码包含美元变量,则应将其扩展,否则它不会为 \n \t 并按原样打印所有其他内容。

答案4

检查已接受的答案命令行上双引号“”、单引号‘’和反引号‘’之间的区别?

为了举例,假设变量 foo 包含 uname。

echo "$foo" outputs uname, subtitute variables in text.
echo '$foo' outputs $foo, the exact string (only ' should be escaped \').
echo `$foo` outputs Linux, execute the content of the variable and echo outputs it.

这里还有一些不错的命令行指南

相关内容