linux循环显示字符,shell输出与终端宽度相同的重复字符

我们有时候希望输出与当前终端宽度相等(或成正比)的重复字符,一般用作分隔、提示等,说白了就是好看或易于辨识一点点,例如使用yum安装软件时的那一排=,总是刚好排满一行,不会多不会少

Dependencies Resolved

===============================================================================

Package Arch Version Repository Size

===============================================================================

Reinstalling:

vim-enhanced x86_64 2:7.4.160-5.el7 os 1.0 M

Transaction Summary

===============================================================================

Reinstall 1 Package

这个功能的实现的两个重点:

获取到当前终端的“宽度”

重复输出刚好填满一行的字符

获取终端的“宽高”(列数和行数)

终端以单个字符为基本“单位”,终端中一行能输入多少个字符,该行就能划分成多少列(columns),也就是该行有多“宽”,“高度”亦同,即当前终端能划分成多少行(lines)。

我们可以使用以下方法获取终端的列数(宽)和行数(高):

$COLUMNS和LINES内置变量

tput cols和tput lines

stty size(输出两个数字,以空格分开,前面为行数--高,后面为列数-宽)

重复输出同一个字符串

这里我们以单个字符=为例,实现输出10个连续的=即==========

重复输出一个字符

使用printf

s=$(printf "%-10s" "=")

echo -e "${s// /=}"

#或

#sed "s/ /=/g"

#printf "%-10s" "="|sed "s/ /=/g"

prints前面的10表示占用10个字符宽度,-表示左对齐(没有该符号表示右对齐),%s不必说,就是很多语言中的占位符号,s表示string类型(不过把宽度10写到里面真是。。。)

因此print语句就是占用10个字符的宽度,以=字符串填充,不过只有一个=因此实际上是1个+9个空格占位=

再将9个空格替换成=

使用seq

seq作用是连续输出指定的数字,用法:

seq [选项]... 尾数

seq [选项]... 首数 尾数

seq [选项]... 首数 增量 尾数

默认的,seq以\n为分隔符,每行输出一个数字,如果不指定首数,则首数为1,如果不指定增量,则增量也为1。

seq 3 #这里只写了一个数字,则改数字就被当作尾数 也就是终止的数字

输出

1

2

3

seq -s "=" 10|sed -E "s/[0-9]//g"

seq以=为分隔符生成与终端宽度字符数量相等的数字(形如1=2=3=4)

sed正则匹配所有数字并替换为空字符串。

因此输出文章开头举例的那种一行=也就容易了:

#使用sed+print

printf "%-${COLUMNS}s" "="|sed "s/ /=/g"

#使用seq+sed

seq -s "=" ${COLUMNS}|sed -E "s/[0-9]//g"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值