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
3seq -s "=" 10|sed -E "s/[0-9]//g"
- seq以
=
为分隔符生成与终端宽度字符数量相等的数字(形如1=2=3=4
) - sed正则匹配所有数字并替换为空字符串。
- seq以
因此输出文章开头举例的那种一行=
也就容易了:
#使用sed+print printf "%-${COLUMNS}s" "="|sed "s/ /=/g" #使用seq+sed seq -s "=" ${COLUMNS}|sed -E "s/[0-9]//g"
相关推荐
wangzhaotongalex 2020-10-20
rechanel 2020-11-16
tianhuak 2020-11-24
huha 2020-10-16
lianshaohua 2020-09-23
laisean 2020-11-11
zhangjie 2020-11-11
大牛牛 2020-10-30
firefaith 2020-10-30
liguojia 2020-10-20
以梦为马不负韶华 2020-10-20
CARBON 2020-10-20
彼岸随笔 2020-10-20
lianshaohua 2020-10-20
yutou0 2020-10-17
JohnYork 2020-10-16
xiaonamylove 2020-10-16
Julyth 2020-10-16
applecarelte 2020-10-16