[背景]
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。上面两条线(即错线和有效线)的长度几乎相等。
答案 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''
不会这样做。