我想将包含换行符的字符串作为命令行参数发送到我的程序,如下所示:
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 中不是任何类型的分隔符当然是值得的。 空白区域用于分词——引号不会界定一个参数的结束点和另一个参数的开始点。这意味着您可以在单个参数中自由混合引用方法。 (本网站其他地方已经对此有很好的描述;我将看看是否可以找到它并链接到它。)