【问题标题】:bash: $(...) trims trailing empty lines. How to properly assign to variable a command's output? [duplicate]bash: $(...) 修剪尾随的空行。如何正确分配给变量命令的输出? [复制]
【发布时间】:2014-09-28 01:16:54
【问题描述】:

[上下文]

例 1:

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

我明白了: 0

例 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);

附:上面两条线(即错误线和有效线)的长度几乎相等。

【问题讨论】:

  • @chepner 这很相似,但不是重复的恕我直言。正如我即将回答的那样,最好将mapfile 用于数组中以跟踪单独的行。 mapfile a &lt; &lt;(echo $'\n\n\n\n\n'); echo ${#a[@]}.

标签: bash command output newline trim


【解决方案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'' 不会这样做。

【讨论】:

  • 我看到输出“0”,而不是“5”。 (KUbuntu 13.10)
  • @ChapaikinVA:这与我拥有的发行版相同,它是从终端剪切和粘贴的。 (使用 bash 4.3,但这不应该有任何区别)。
  • 我的 bash:GNU bash,4.2.45(1)-release (i686-pc-linux-gnu)。
  • +1 表示答案的第二部分。这应该适用于 OP。
  • @ChapaikinVA:它在两个 bash 版本上的工作方式相同,所以我不知道你是如何让它回显 0 的。但这主要是个玩笑。我稍后会从答案中删除它。
猜你喜欢
  • 2011-01-19
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
相关资源
最近更新 更多