4

重複の可能性:
bashのPrintfの例では改行が作成されません

3つの関数を1つの配列に集約するサンプルスクリプト「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

サブシェル拡張は改行文字をカットするように見えますが、それらが最後に発生する場合に限ります。これが応急修理です:

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

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