2012-11-15 16 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