2010-08-13 89 views
10

我想通過BASH將包含換行符的字符串傳遞給PHP腳本。用換行符在bash中命令的管道字符串?

#!/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」的文字換行?

順便說一句:< < < <在bash中做什麼?我知道在一個文件<通行證...

回答

17

嘗試

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

其中-e使得反斜線的解釋(根據man echo

注意,這也將解釋反斜槓轉義,你可能有${message}${changed}


從bash的手冊: 這裏字符串

這裏憑證的變型中,格式爲:

<<<word 

word被擴展並在其標準輸入提供給命令。

所以我說

the_cmd <<< word 

相當於

echo word | the_cmd 
+0

不錯!它實際上是-e而不是-a,但這正是我所期待的。 – 2010-08-13 13:55:40

+0

是的,你是對的,我在想 - 呃但是打字 - 一個......我會糾正這個。 – 2010-08-13 14:01:16

+0

'the_cmd <<< word'不等於'echo word | the_cmd':'<<<'似乎可以處理更長的字符串。 – 2014-03-01 21:20:16

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

<<<被稱爲 「這裏字符串」。這是「here doc」的單行版本,不需要諸如「EOF」之類的分隔符。這是一個在這裏的文件版本:

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

,以避免在${message}${changed}潛在轉義序列的解釋,嘗試在子shell串聯的字符串(除非你指定-n選項換行符每個echo後附) :

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

括號在子shell(如果沒有括號分別給予,僅第二回波的輸出將通過管道輸送到PHP程序)執行的命令。

+0

「爲了避免...」 - 如果您使用'echo -e' – 2010-08-13 14:19:06

相關問題