bash:$(...)修剪尾随空行。如何正确分配变量命令的输出?

时间:2014-09-28 01:16:54

标签: bash command output newline trim

[背景]

Eg.1:

a="$(echo $'\n\n\n\n\n')"; echo ${#a};

我明白了: 0

Eg.2:

a="$(echo $'\n\n\n\n\n_')"; echo ${#a};

我明白了: 6

[问题/疑问]

我需要将赋值中的所有尾随空行保留为变量。如何重写«Eg.1»?如果可能,请提供最简单的解决方案。

[解决]

我会接受rici答案的变体2

to() 
{
    local to=${1};

    IFS= read -rd '' ${to}; 
    printf -v ${to} "${!to%$'\n'}";
};

…
# a="$(echo $'\n\n\n\n\n')"; # wrong

to a < <(echo $'\n\n\n\n\n');
…

# aVariable="$(some_command arg_1 … arg_n)"; # wrong assignment
to aVariable < <(some_command arg_1 … arg_n);

P.S。上面两条线(即错线和有效线)的长度几乎相等。

1 个答案:

答案 0 :(得分:1)

以下两个解决方案可以使用任意命令:

1)在末尾添加额外的字符,然后将其删除:

$ a="$(printf '\n\n\n\n\n'; echo _)"; a="${a%?}"; echo ${#a}
5

2)使用read

$ IFS= read -rd '' a < <(printf '\n\n\n\n\n'); echo ${#a}
5

-d''之间的空格是必要的;你需要为-d选项提供一个空参数,而-d''不会这样做。