4

可能重复:
bash 中的 Printf 示例不创建换行符

我有一个示例脚本“array-test.sh”,它将三个函数聚合到一个数组中:

[user@host ~]$ 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[@]}"
[user@host ~]$ ./array-test.sh 
cat dog mouse
[user@host ~]$ 

但是,缺少换行符。是什么导致了这种行为?

4

3 回答 3

2

另一种选择:@在字符串末尾添加一个字符(此处)。字符串中间的换行符将保留在$( ... ). 然后,通过参数扩展删除字符:

#!/bin/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)
    array[index]=${array[index]%@}
done

echo "${array[@]}"
于 2012-11-15T13:47:11.980 回答
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[@]}"
于 2012-11-15T11:47:48.120 回答
1

似乎 subshel​​l 扩展会削减换行符,但前提是它们出现在末尾。这是一个kludge:

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

foo=$(function3)
foo=${foo%-}
echo "$foo"
于 2012-11-15T14:18:07.217 回答