双引号中的 $'\n' 不起作用

双引号中的 $'\n' 不起作用

我想将包含换行符的字符串作为命令行参数发送到我的程序,如下所示:

myprogram Hello$'\n'World

但是当我在字符串上使用双引号时:

myprogram "Hello$'\n'World Hello Again"

那么接收到的字符串myprogram将包含该字符串$'\n'而不是换行符。

答案1

如果引用,该$'…'构造将不起作用。使用:

$ myprogram "Hello"$'\n'"World Hello Again"

或者

$ myprogram Hello$'\n'World\ Hello\ Again

或者

$ a=$'\n'
$ myprogram "Hello${a}World Hello Again"

或者

$ myprogram "$(echo -e 'Hello\nWorld Hello Again')"

或者

$ myprogram "Hello
World Hello Again"

答案2

该字符串不需要包含在一对包罗万象的引号中;单独引用的字符串可以连接成一个单词。

myprogram Hello$'\n'"World Hello Again"

引号不定义字符串;他们只是逃避了他们之间出现的每一个角色。

答案3

交替,

myprogram "$(printf '%s\n' "Hello" "world once" "World Hello Again")"

printf 命令将重新使用格式字符串来消耗给定的所有参数。此外,$()语法将自动删除任何尾随换行符。

答案4

有趣的是,在三个答案中,没有人指出最简单的解决方案:

myprogram $'Hello\nWorld Hello Again'

由于美元报价(可以说)引用的一种形式,只需将其用于整个论证即可。

当然,了解引号在 bash 中不是任何类型的分隔符当然是值得的。 空白区域用于分词——引号不会界定一个参数的结束点和另一个参数的开始点。这意味着您可以在单个参数中自由混合引用方法。 (本网站其他地方已经对此有很好的描述;我将看看是否可以找到它并链接到它。)

相关内容