2012-11-15 36 views
4

可能重複:
Printf example in bash does not create a newline爲什麼bash數組忽略換行符?

我有一個示例腳本 「array-test.sh」 它彙集三個功能到一個陣列:

[[email protected] ~]$ cat array-test.sh 
#!/usr/bin/env bash 

function1() { 
    printf '%s\n\n\n' "cat" 
} 

function2() { 
    printf '%s\n\n\n' "dog" 
} 

function3() { 
    printf '%s\n\n\n' "mouse" 
} 

for function in\ 
    function1\ 
    function2\ 
    function3; do 
    array[$((index++))]=$($function) 
done 

echo "${array[@]}" 
[[email protected] ~]$ ./array-test.sh 
cat dog mouse 
[[email protected] ~]$ 

然而,換行字符丟失。什麼導致這種行爲?

+1

我相信'$()'行爲像反向運算符。 –

+0

你爲什麼發佈這個複雜的代碼?你可以用'echo'$(function1)'' –

+0

@KolyolyHorvath重現問題:因爲這是問題的實質,通常是最困難的事情。你(聲稱)立即看到它的事實只能證明你比OP更習慣於bash的怪癖。你爲什麼不給出一個答案而不是一個可疑的評論炫耀你的優越性? –

回答

1

正如ÁlvaroG.Vicario所示,反引號(和$())刪除了後面的換行符。不可迴避,所以如果你一定要,你就必須解決它:

#!/usr/bin/env bash  

function1() { 
    printf '%s' "cat" 
} 

function2() { 
    printf '%s' "dog" 
} 

function3() { 
    printf '%s' "mouse" 
} 

for function in\ 
    function1\ 
    function2\ 
    function3; do 
    array[$((index++))]=$($function) 
done 

# manually add three newlines here 
array=("${array[@]/%/$'\n'$'\n'$'\n'}") 

echo "${array[@]}" 
+0

謝謝你的回覆!你能解釋一下這種技術如何被調用:''$ {array [@] /%/ $'\ n'$'\ n'$'\ n'}「'?這個參數是否爲數組擴展? – Martin

+0

@Martin - '$'\ n'' => 0x0a字符; '\ n'' => \ n個字符。 這是一種將轉義序列內插爲文字字符串的方法。 – amphetamachine

+0

這應該是「模式替換」。用法是'$ {parameter/pattern/string}'。我正確的說,如果是「%」,那麼被拖到的末尾? – Martin

2

另一種選擇:在字符串的末尾添加字符(@這裏)。字符串中間的換行符將保存在$(...)中。然後,通過參數擴展刪除字符:

#!/bin/bash 
function1() { 
    printf '%s\n\n\[email protected]' "cat" 
} 

function2() { 
    printf '%s\n\n\[email protected]' "dog" 
} 

function3() { 
    printf '%s\n\n\[email protected]' "mouse" 
} 

for function in\ 
    function1\ 
    function2\ 
    function3; do 
    array[index++]=$($function) 
    array[index]=${array[index]%@} 
done 

echo "${array[@]}" 
1

看起來像子外殼擴展削減換行符,但只有當它們發生在最後。這裏有一個混合:

function3() { 
    printf '%s\n\n\n-' "mouse" 
} 

foo=$(function3) 
foo=${foo%-} 
echo "$foo" 
+0

這很聰明:)但是,由於某些原因,「狗」和「鼠標」在它們前面仍然有一個空格字符。 – Martin

+0

您需要在每個函數中將「 - 」字符添加到輸出字符串的末尾。但它可以是任何角色,只要你在'$ {foo%HERE}'中擁有它。 – amphetamachine