bash:如何传递包含特殊字符的命令行参数

Chr*_*ian 40 linux bash command-line special-characters

我自己写了一个program需要正则表达式作为输入的 linux 程序。

我想在bashshell 中调用程序并将该正则表达式作为命令行参数传递给程序(还有其他命令行参数)。一个典型的正则表达式看起来像

[abc]\_[x|y]
Run Code Online (Sandbox Code Playgroud)

不幸的是,字符[,]|bash. 因此,调用

program [abc]\_[x|y] anotheragument
Run Code Online (Sandbox Code Playgroud)

不起作用。有没有办法通过使用某种转义字符或引号等来传递表达式?

(调用program "[abc]\_[x|y] anotheragument"也不起作用,因为它将两个参数解释为一个。)

ant*_*ris 33

您可以:

  1. 使用反斜杠(如\[abc\]_\[x\|y\])或
  2. 双引号整个参数(如"[abc]_[x|y]")。

编辑:正如有些人指出的那样,双引号不会阻止变量扩展或命令替换。因此,如果您的正则表达式包含可以被 bash 解释为其中之一的内容,请改用单引号

  • 在 bash 中,双引号 ** 不** 绕过扩展变量 `"$HOME"` 或参数 `"${USER:-root}"`,命令替换形式为 `"$(date)"` 或 ` `"`date`"`,算术扩展`"$((1 + 2))"`,历史扩展`"!!"` 或反斜杠转义`"\\"`。请改用单引号。请参阅 bash 手册的手册页,标题为“引用”的部分。 (6认同)

Fli*_*imm 31

使用单引号。单引号确保不解释任何字符。

$ printf %s 'spaces  are  not  interpreted away
neither are new lines
nor variable names $TESTING
nor square brackets [TESTING]
nor pipe characters or redirection symbols | > <
nor the semicolon ;
nor backslashes \a \b \c \\
the only thing that does not work is the single quote itself
'
Run Code Online (Sandbox Code Playgroud)

如果您需要嵌入单引号,有两种解决方案:

$ printf '%s\n' '[ Don'"'"'t worry, be happy! ]'
[ Don't worry, be happy! ]
$ printf '%s\n' '[ Don'\''t worry, be happy! ]'
[ Don't worry, be happy! ]
Run Code Online (Sandbox Code Playgroud)


Eva*_*oll 7

man bash

存在三种引用机制:转义字符、单引号和双引号。

未加引号的反斜杠 ( \ ) 是 转义字符。它保留了下一个字符的字面值,<newline> 除外。如果出现\ <newline> 对,并且反斜杠本身没有被引用,则\ <newline> 被视为行继续(即,它从输入流中删除并有效地被忽略)。

将字符括在单引号中会保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠。

双引号中的字符会保留引号内所有字符的字面值,但$`\除外,并且在启用历史扩展时,! . 字符$`在双引号内保留其特殊含义。反斜杠仅在后跟以下字符之一时才保留其特殊含义:$`"\<newline>。双引号可以通过在双引号内加上反斜杠来引用。如果启用,历史扩展将被执行,除非出现在双引号中的是使用反斜杠进行转义。!前面的反斜杠没有被移除。

特殊参数*@在双引号中具有特殊含义(请参阅下面的参数)。

$' string '形式的单词被特殊处理。单词扩展为string,并按照 ANSI C 标准的规定替换反斜杠转义字符。反斜杠转义序列(如果存在)按如下方式解码:

       \一个     警报(钟形)
        \ b     退格
       。\ E 
       。\ E     转义字符
       \˚F     形式进料
       \ n     新行
       \ r     回车
       \吨     水平制表
       符\ v     垂直制表
       \\     反斜杠
       \”     单引号
       \”     双引号
       \ NNN   的八位字符,其值为八进制值nnn
              (一到三位数)
       \x HH   其值为十六进制值的八位字符HH
              (一或两个十六进制数字)
       \u HHHH Unicode (ISO/IEC 10646) 字符,其值为
              十六进制值HHHH(一到四个十六进制数字)
        \U HHHHHHHH
              Unicode (ISO/IEC 10646) 字符,其值为
              十六进制值HHHHHHHH(一到八个十六进制数字)
        \c x    一个 control- x字符

扩展结果是单引号的,就好像美元符号不存在一样。

以美元符号 ( $" string " )开头的双引号字符串将使该字符串根据当前语言环境进行翻译。如果当前语言环境是CPOSIX,则忽略美元符号。如果字符串被翻译和替换,则替换是双引号。