如何在bash“未触及”中回显带有多个空格的字符串?

use*_*548 30 shell bash shell-script

我分配了一个这样的变量:

MYCUSTOMTAB='     '
Run Code Online (Sandbox Code Playgroud)

但是在 echo 中使用它:

echo $MYCUSTOMTAB"blah blah"
Run Code Online (Sandbox Code Playgroud)

或者

echo -e $MYCUSTOMTAB"blah blah"
Run Code Online (Sandbox Code Playgroud)

只返回一个空格和字符串的其余部分:

 blah blah
Run Code Online (Sandbox Code Playgroud)

如何原封不动地打印完整的字符串?我想用它来自定义缩进,因为\t对我的口味来说太宽了。

cuo*_*glm 44

将您的变量放在双引号内以防止字段拆分,这会占用您的空间:

$ MYCUSTOMTAB='     '
$ echo "${MYCUSTOMTAB}blah blah"
     blah blah
Run Code Online (Sandbox Code Playgroud)


tec*_*raf 11

正如这个答案中所建议的那样,引用变量就足够了。

在您的情况下需要引用的原因是因为没有它 bash 会将 split+glob 运算符应用于$MYCUSTOMTAB. 默认值$IFS包含制表符,所以echo -e $MYCUSTOMTAB"blah blah"$MYCUSTOMTAB仅仅是分裂成什么使它成为一样的,如果你写了:

echo -e "blah blah"
Run Code Online (Sandbox Code Playgroud)

-e顺便说一句,您可能不想要这里)。

您还可以使用printf代替echo

printf '%s\n' "$MYCUSTOMTAB"

printf '%s\n' "${MYCUSTOMTAB}blah blah"
Run Code Online (Sandbox Code Playgroud)

或者,如果您想做printf相同类型的\n,\t扩展echo -e,请使用%b代替%s

printf '%b\n' "${MYCUSTOMTAB}blah blah"
Run Code Online (Sandbox Code Playgroud)

供参考阅读为什么 printf 比 echo 好?

  • 虽然严格正确,但这里的原因与 `printf` 和 `echo` 之间的区别完全无关。虽然 `printf` 肯定更便携并且有一些优点,但它的主要缺点是它丑陋且不可读,而且更难以理解。 (2认同)
  • 如果使用得当,printf 会“更好”:您需要编写 `printf "blah%sblah\n" "$MYCUSTOMTAB"` -- 如果变量包含任何 %s、%d 等,则会出错否则输出。 (2认同)