在 bash 中有没有比使用 tr -d 更好的回显方式?
Is there a better way to echo without a newline in bash than using tr -d?
我有一个从 5 倒数到 0 的脚本:
for a in {5..0}; do echo $a | tr -d \n; sleep 1; echo -e \b | tr -d \n; done
并添加 tr -d
对我来说看起来多余而且不太优雅。有没有办法在一行中回显而不必删除换行符?
您可以将 -n
标志与 echo
一起使用:
for a in {5..0}; do echo -n $a; sleep 1; echo -ne \b; done
或者直接使用 printf
:
for a in {5..0}; do printf $a; sleep 1; printf \b; done
请注意,如果从大于或等于 10
的数字开始计数,这将显示无效数字。您可以使用 \r
carriage return 字符并用 space 清除该行,例如假设最多 20 位数字并使用左格式并用 spaces 填充该行:
for a in {20..0}; do printf "\r%-20d" "$a"; sleep 1; done
使用 bash COLUMNS
变量和 *
参数传递宽度说明符 printf
你可以用 spaces 填充整行:
for a in {20..0}; do printf "\r%-*d" "$COLUMNS" "$a"; sleep 1; done
或者使用 ansi 转义序列来清除行:
for a in {20..0}; do printf "\r3[K%d" "$a"; sleep 1; done
我有一个从 5 倒数到 0 的脚本:
for a in {5..0}; do echo $a | tr -d \n; sleep 1; echo -e \b | tr -d \n; done
并添加 tr -d
对我来说看起来多余而且不太优雅。有没有办法在一行中回显而不必删除换行符?
您可以将 -n
标志与 echo
一起使用:
for a in {5..0}; do echo -n $a; sleep 1; echo -ne \b; done
或者直接使用 printf
:
for a in {5..0}; do printf $a; sleep 1; printf \b; done
请注意,如果从大于或等于 10
的数字开始计数,这将显示无效数字。您可以使用 \r
carriage return 字符并用 space 清除该行,例如假设最多 20 位数字并使用左格式并用 spaces 填充该行:
for a in {20..0}; do printf "\r%-20d" "$a"; sleep 1; done
使用 bash COLUMNS
变量和 *
参数传递宽度说明符 printf
你可以用 spaces 填充整行:
for a in {20..0}; do printf "\r%-*d" "$COLUMNS" "$a"; sleep 1; done
或者使用 ansi 转义序列来清除行:
for a in {20..0}; do printf "\r3[K%d" "$a"; sleep 1; done