在bash中使用newline命令管道字符串?

时间:2010-08-13 13:47:20

标签: bash

我试图通过BASH将包含换行符的字符串传递给PHP脚本。

#!/bin/bash

REPOS="$1"
REV="$2"

message=$(svnlook log $REPOS -r $REV)
changed=$(svnlook changed $REPOS -r $REV)

/usr/bin/php -q /home/chad/www/mantis.localhost/scripts/checkin.php <<< "${message}\n${changed}"

当我这样做时,我会看到文字“\ n”而不是转义的换行符:

blah blah issue 0000002.\nU app/controllers/application_controller.rb

如何将'\ n'翻译成文字换行符?

顺便说一下:什么&lt;&lt;&lt;在bash做什么?我知道&lt;传入文件...

3 个答案:

答案 0 :(得分:19)

echo -e "${message}\n${changed}" | /usr/bin/php -q /home/chad/www/mantis.localhost/scripts/checkin.php 

其中-e启用反斜杠转义的解释(根据man echo

请注意,这也将解释您在${message}${changed}中可能具有的反斜杠转义。


来自bash手册:   这里的字符串

此处文件的变体,格式为:

<<<word

单词被扩展并在其标准输入上提供给命令。

所以我要说

the_cmd <<< word

相当于

echo word | the_cmd

答案 1 :(得分:4)

newline=$'\n'
... <<< "${message}${newline}${changed}"

<<<被称为“here string”。它是“here doc”的单行版本,不需要诸如“EOF”之类的分隔符。这是一个这里的文档版本:

... <<EOF
${message}${newline}${changed}
EOF

答案 2 :(得分:1)

为了避免在${message}${changed}中解释潜在的转义序列,请尝试连接子shell中的字符串(除非您指定{echo,否则会在每个-n后追加换行符。 1}}选项):

( echo "${message}" ; echo "${changed}" ) | /usr/bin/php -q /home/chad/www/mantis.localhost/scripts/checkin.php 

括号在子shell中执行命令(如果没有给出括号,只有第二个echo的输出将通过管道传输到你的php程序中。)