shell 打印一个字符直到行尾

kyvafyod  于 2022-11-30  发布在  Shell
关注(0)|答案(5)|浏览(188)

我想知道是否有可能打印任何字符,直到行尾。我知道这是一个愚蠢的要求。但如果有可能,那么这将有助于我改善我的脚本外观,因为人们使用不同大小的腻子窗口。
目前我正在打印“-”直到EOL基于大小我的窗口。但大小不同和“-”来到下一行在其他终端。如下所示:
回声“-----------------------------------------------------------------------------------------------------------”
我需要在shell脚本中完成此操作。有没有办法找到屏幕宽度并相应地打印?

von4xj4u

von4xj4u1#

您可以使用:

cols=$(tput cols)
for ((i=0; i<cols; i++));do printf "-"; done; echo

或在非BASH使用中:

cols=`tput cols`
i=0
while [ $i -lt $cols ]; do echo -n "-"; i=`expr $i + 1`; done; echo
yrwegjxp

yrwegjxp2#

您可以使用:

tput cols

以获取屏幕宽度。

uyhoqukh

uyhoqukh3#

正如其他人所说,tput cols是获取终端宽度的一种合理的标准方法。当您调整终端大小时,现代终端应该发送一个SIGWINCH,可以捕获该命令并使用它来重新确定终端的大小。一些shell内置了对此的支持。如果您使用bash shell并打开了checkwinsize shell选项,bash将尝试通过捕获此信号来保持环境变量LINESCOLUMNS正确。
你甚至可以疯了,自己设下陷阱。我发现这既有教育意义,也有误导作用:

trap 'tput cols' SIGWINCH

上面的命令导致shell在重新调整大小时不是 * 立即 * 输出当前的单词width,而是在重新调整大小后的下一次输入时输出。我假设这不是因为信号在后面触发,而是因为这是trap运行命令的最早机会。我认为这是shell的限制。

pvcm50d1

pvcm50d14#

它在zsh中工作,没有评估...

eval printf '=%.0s' {1..$(tput cols)}
  • bash eval将$(tput cols)替换为终端列计数
  • bash使用以空格分隔的整数列表替换{1..count}。
  • bash printf根据format =%.0s的每个参数计算该值。
  • printf回显等号,因为它没有经过格式转换
  • printf %存在格式安全性
  • printf %.存在宽度规范
  • printf %.0指定零个字符宽
  • printf %.0s指定宽度规格的结尾,并表示参数将被视为字符串,同时也结束格式序列。
4szc88ey

4szc88ey5#

for i in {1..$(tput cols)}; do echo -n '='; done

相关问题