Linux Bash:如何避免行首出现空白?

Linux Bash:如何避免行首出现空白?,linux,bash,Linux,Bash,在bash中给出这样一个命令: echo -e "a b "{1..3}" d e\n" a b 1 d e a b 2 d e a b 3 d e 第2行的输出。。。以空白开始。为什么呢?它来自哪里?我怎样才能避免呢 我确实知道如何用sed或其他方法摆脱它,但我更愿意首先避免它 我只提到了它,还有{..}-语法。没有它,还有其他类似的情况吗 更新: 一个有用的解决方法是,删除带有退格的第一个字母: echo -e "\ba b "{1..3}" d e\n" 或者,正如Jared Ng

在bash中给出这样一个命令:

echo -e "a b "{1..3}" d e\n"
a b 1 d e
 a b 2 d e
 a b 3 d e
第2行的输出。。。以空白开始。为什么呢?它来自哪里?我怎样才能避免呢

我确实知道如何用sed或其他方法摆脱它,但我更愿意首先避免它

我只提到了它,还有{..}-语法。没有它,还有其他类似的情况吗

更新: 一个有用的解决方法是,删除带有退格的第一个字母:

echo -e "\ba b "{1..3}" d e\n"
或者,正如Jared Ng所建议的:

echo -e "\ra b "{1..3}" d e\n"
更新2: 我们通过以下方式摆脱了领先的新线:

echo -e "\na b "{1..4}" d e" | sed '1d'
echo -e "\na b "{1..4}" d e" | tail -n +2
或尾随:

echo -e "\ba b "{1..3}" d e\n" | sed '$d'
echo -e "\ba b "{1..3}" d e\n" | head -n 3
帮我修好。输出:

a b 1 d e
a b 2 d e
a b 3 d e
\r
是回车符——它将插入符号带回到行首,防止空格)


bash为什么这样做?运行
echo“abc”{1..3}
。您将看到bash输出:abc1 abc2 abc3。注意中间的空格吗
{1..3}
展开表达式,以空格分隔。当您使用换行符时,如在
echo“abc”{1..3}“\n”
中所示,bash保留这些空格,并根据请求简单地添加换行符。这些就是输出中显示的内容。

{…}
扩展为一系列以空格分隔的备选方案,因此实际上

echo "a b "1" d e\n" "a b "2" d e\n" "a b "3" d e\n"
\n
后面的空格是您在输出中看到的空格

您可以尝试将
\n
移动到字符串的开头,如

echo -e "\na b "{1..3}" d e"
更新

另一种方法(未测试,抱歉)

用于生成用作命令参数的条目列表。生成的条目始终以空格分隔,因此会有额外的空格

要按原样使用
{1..3}
语法,您需要使用一个命令,该命令可以将生成的每个条目视为一个独立的arg(
echo
只需按它看到的内容打印出来)。这里的一个好选项是
printf
(正如@glenn在上面的评论中所建议的那样)


为什么caret不从一开始就开始?这确实有效,但这是一个解决wierd问题的wierd解决方案。这似乎是解释
\n
的方式的一部分-如果将其移动到行的开头,则在输出行的末尾会有一个随机空格…这里,这可能说明bash有这种奇怪之处的原因。运行
echo“abc”{1..3}
。您将看到bash输出:
abc1 abc2 abc3
。注意中间的空格吗?当您使用换行符`echo“abc”{1..3}”\n时,bash会保留这些空格,并根据请求简单地添加一个换行符。这些就是输出中显示的内容。@nm:这不是很好,因为在输出的开头会有一行额外的内容output@KitHo:现在,在末尾有一个额外的换行符(可能可以避免使用一些额外的标志来
echo
)。其他解决方案在最后一行有问题,删除第一行和删除最后一行一样简单,不是吗?sh也有这个问题吗?
printf
可以更好地控制输出:
printf“%s\n”ab{1..3}“de”
sh有
{a..n}
吗?不,我不认为sh有花括号扩展。另一个解决方法:
eval“echo”ab{1..3}“de';”
echo -e "\na b "{1..3}" d e"
 printf "%s\n" "a b "{1..3}" d e"
[me@home]$ printf "%s\n" "a b "{1..3}" d e"
a b 1 d e
a b 2 d e
a b 3 d e