Linuxshell学习笔记(3)

print命令 

print 命令用法

不加参数的 print 和 echo 的功能基本一样,但如果字符串里包含转义字符,某些情况可能不一致。

% print 'Line\tone\n\Line\ttwo'
Line    one
Line    two

# echo 的输出和 print 不一致
% echo 'Line\tone\n\Line\ttwo'
Line    one
\Line   two

print 有很多参数,在 zsh 里输入 print - 然后按 tab 即可查看选项帮助

# - 后直接按 tab,C 是补全上去的
% print -C
 -- option --
-C  -- print arguments in specified number of columns
-D  -- substitute any arguments which are named directories using ~ notation
-N  -- print arguments separated and terminated by nulls
...

printf 命令很像 c 语言的 printf 函数,用于输出格式化后的字符串:

# 末尾输出高亮的 % 代表该行末尾没有换行符
# printf 不会在输出末尾自动添加换行符
# 为了避免误解,之后的例子省略该 % 符号
% printf ":%d %f:" 12 34.56
:12 34.560000:%

注意:printf 不会在输出末尾自动添加换行符; 

printf 的第一个参数是格式化字符串在 zsh 里输入 printf % 后按 tab,可以看到所有支持的用法。下面只举几个比较常用的例子:

# 整数 浮点数 字符串
% printf "%d %f %s" 12 12.34 abcd
12 12.340000 abcd%

# 取小数点后 1 位
% printf "%.1f" 12.34
12.3

# 科学计数法输出浮点数
% printf "%e" 12.34
1.234000e+01

# 将十进制数字转成十六进制输出
% printf "%x" 12
c

# 补齐空格或者补齐 0
% printf "%5d\n%05d" 12 12
   12
00012

 

 print 命令选项功能介绍

-l 用于分行输出字符串

# 每个字符串一行,字符串列表是用空格隔开的
% print -l aa bb
aa
bb

# 也可以接数组,数组相关的内容之后会讲到
# 命令后的多个字符串都可以用数组取代,效果是相同的
% array=(aa bb)
% print -l $array
aa
bb

 

-n 用于不在输出内容的末尾自动添加换行符echo 命令也有这个用法):

% print abc
abc
# 下面输出 abc 后的 % 高亮显示,代表这一行末尾没有换行符
% print -n abc
abc%

-m 用于只输出匹配到的字符串:

% print -m "aa*" aabb abc aac
aabb aac

-o/-O/-i 用于对字符串排序

# print -o 对字符串升序排列
% print -o a d c 1 b g 3 s
1 3 a b c d g s

# print -O 对字符串降序排列
% print -O a d c 1 b g 3 s
s g d c b a 3 1

# 加 -i 参数后,对大小写不敏感
% print -oi A B C a c A B C
A a A B B C c C

# 不加 -i 的话小写排在大写的前面
% print -o A B C a c A B C
a A A B B c C C

-r 用于不对字符串进行转义print 默认是会对转义字符进行转义的,加 -r 后会原样输出

% print -r '\n'
\n

-c 用于将字符串按列输出。如果对自动决定的列数不满意,可以用 -C 指定列数

% print -c a bbbbb ccc ddddd ee ffffff gg hhhhhh ii jj kk
a       ccc     ee      gg      ii      kk
bbbbb   ddddd   ffffff  hhhhhh  jj

-C 用于按指定列数输出字符串:

# 从上到下
% print -C 3 a bb ccc dddd ee f
a     ccc   ee
bb    dddd  f

% print -C 3 a bb ccc dddd ee f g
a     dddd  g
bb    ee
ccc   f

# 加 -a 后,改成从左向右
% print -a -C 3 a bb ccc dddd ee f g
a     bb    ccc
dddd  ee    f
g

-D 用于将符合条件的路径名转化成带 ~ 的格式(~ 是家目录):

% print -D /home/goreliu/git
~/git

# mine 是这样定义的 hash -d mine='/mnt/c/mine'
% print -D /mnt/c/mine
~mine

-N 用于将输出的字符串以 \x00(null)分隔,而不是空格。这样可能方便处理包含空格的字符串,xargs 等命令也可以接受以 \x00 分隔的字符串

% print -N aa bb cc
aabbcc%

% print -N aa bb cc | hexdump -C
00000000  61 61 00 62 62 00 63 63  00                       |aa.bb.cc.|
00000009

-x 用于将行首的 tab 替换成空格-x 是将行首的 tab 展开成空格,-x 后的参数是一个 tab 对应的空格数:

% print -x 2 '\t\tabc' | hexdump -C
00000000  20 20 20 20 61 62 63 0a                           |    abc.|
00000008

% print -x 4 '\t\tabc' | hexdump -C
00000000  20 20 20 20 20 20 20 20  61 62 63 0a              |        abc.|
0000000c

-X 用于将所有的 tab 补全成空格。注意不是简单地替换成空格。比如每行有一个 tab,-X 8,那么如果 tab 前(到行首或者上一个 tab)有 5 个字符,就补全 3 个空格,凑够 8,这么做是为了对齐每一列的。但如果前边有 8 个或者 8 个以上字符,那么依然是一个 tab 替换成 8 个字符,因为 tab 不能凭空消失,一定要转成至少一个空格才行。如果没理解就自己多试试找规律吧。

% print -X 2 'ab\t\tabc' | hexdump -C
00000000  61 62 20 20 20 20 61 62  63 0a                    |ab    abc.|
0000000a

% print -X 4 'ab\t\tabc' | hexdump -C
00000000  61 62 20 20 20 20 20 20  61 62 63 0a              |ab      abc.|
0000000c

-u 用于指定文件描述符(fd)输出print 默认输出到 fd 1,即 stdout,可以指定成其他 fd(2 是 stderr,其他的可以运行 ls -l /proc/$$/fd 查看。

% print -u 2 good
good

# 和重定向输出效果一样
% print good >&2

-v 用于把输出内容保存到变量:

# 和 str="$(print aa bb cc)" 效果一样
% print -v str aa bb cc
% echo $str
aa bb cc

-s/-S 用于把字符串保存到历史记录

% print -s ls -a
% history | tail -n 1
 2222  ls -a

# -S 也类似,但需要用引号把命令引起来
% print -S "ls -a"
% history | tail -n 1
 2339  ls -a

-z 用于把字符串输出到命令行编辑区:

# _是光标位置
% print -z aa bb cc
% aa bb cc_

-f 用于按指定格式化字符串输出,同 printf,用法见“printf 命令用法”。

-P 用于输出带颜色和特殊样式的字符串,见“输出带颜色和特殊样式的字符串”。

-b 用于辨认出 bindkey 中的转义字符串,bindkey 是 Zle 的快捷键配置内容,写脚本用不到,不作介绍。

-R 用于模拟 echo 命令,只支持 -n 和 -e 选项,通常用不到。

输出带颜色和特殊样式的字符串

用 zsh 的 print -P 可以方便地输出带颜色和特殊样式的字符串,不用再和 \033[41;36;1m 之类莫名其妙的字符串打交道了。

# %B 加粗 %b 取消加粗
# %F{red} 前景色 %f 取消前景色
# %K{red} 背景色 %k 取消背景色
# %U 下滑线 %u 取消下滑线
# %S 反色 %s 取消反色
#
# black or 0  red     or 1
# green or 2  yellow  or 3
# blue  or 4  magenta or 5
# cyan  or 6  white   or 7

# 显示加粗的红色 abc
% print -P '%B%F{red}abc'
abc

# 没覆盖到的功能可以用原始的转义符号,可读性比较差
# 4[0-7] 背景色
# 3[0-7] 前景色
# 0m 正常 1m 加粗 2m 变灰 3m 斜体 4m 下滑钱 5m 闪烁 6m 快速闪烁 7m 反色

# 显示闪烁的红底绿字 abc
% print "\033[41;32;5mabc\033[0m"
abc

 总结:%B 加粗 %b 取消加粗
            %F{red} 前景色 %f 取消前景色
            %K{red} 背景色 %k 取消背景色
            %U 下滑线 %u 取消下滑线
            %S 反色 %s 取消反色

 

print 选项列表

为了方便查询,我把 print 的选项列表放在这里:

选项功能参数
-C按列输出列数
-D替换路径成带 ~ 的版本
-N使用 \x00 作为字符串的间隔
-O降序排列
-P输出颜色和特殊样式
-R模拟 echo 命令
-S放命令放入历史命令文件(要加引号)
-X替换所有 tab 为空格tab 对应空格数
-a和 -c/-C 一起使用时,改为从左到右
-b识别出 bindkey 转义字符串
-c按列输出(自动决定列数)
-f同 printf
-i和 -o/-O 一起用时,大小写不敏感排序
-l使用换行符作为字符串分隔符
-m只输出匹配的字符串匹配模式字符串
-n不自动添加最后的换行符
-o升序排列
-r不处理转义字符
-s放命令放入历史命令文件(不加引号)
-u指定 fd 输出fd 号
-v把内容保存到变量变量名
-x替换行首的 tab 为空格tab 对应空格数
-z把内容放置到命令行编辑区

通配符(glob) 

可以认为是正则表达式的简化版本。通配符在字符串匹配和文件名搜索等方面非常有用。 

通配符的基本用法

之前在字符串匹配判断时,通配符出现过,就是 *$str* 两边的星号。

% str1=abcd
% str2=bc

# 星号要在引号外边
% [[ $str1 == *$str2* ]] && echo good
good

# 注意带通配符的字符串必须放在右边
% [[ *$str2* == $str1 ]] && echo good

注意:1.星号要在引号外边;2.注意带通配符的字符串必须放在右边。

 星号是最常用的通配符,用于匹配任意数量(包括 0 个)的任意字符。

# 问号用于匹配一个任意字符
% [[ abcd == ab?? ]] && echo good
good

# 中括号用于匹配出现在其中的单个字符
% [[ abcd == abc[bcd] ]] && echo good
good

# 如果中括号里第一个字符是 ^,则匹配除了中括号里的单个字符
% [[ abcd == abc[^de] ]] && echo good

% [[ abcd == abc[^ce] ]] && echo good
good

# 中括号里可以指定字符的范围
% [[ a4 == [a-b][2-5] ]] && echo good
good

# 可以指定多个字符范围,并且可以掺杂其他字符
% [[ B4 == [a-cdddA-B][2-5] ]] && echo good
good

# 尖括号用于匹配一定范围的单个整数
% [[ 123 == 12<3-4> ]] && echo good
good

# 可以匹配整个整数
% [[ 123 == <100-200> ]] && echo good
good

# 可以没有上下界,默认的下界是 0,上界是正无穷
% [[ 123 == <100-> && 123 == <-200> ]] && echo good
good

# 可以上下界都没有,那么会匹配任意正整数和 0
# 这个可以用来判断字符串是否构成整数
% [[ 123 == <-> ]] && echo good
good

# ( 1 | 2 | ... ) 用于同时判断多个条件,满足一个即可
% [[ ab == (aa|ab) ]] && echo good
good

# 如果中括号里要用 - 或者 ^,放在最后即可,不需要转义
% [[ -^3 == [a-c-][3^-][3^-] ]] && echo good
good
通配符含义
*任意数量的任意字符
?任意一个字符
[abcd]abcd 中的任意一个字符
[^abcd]除 abcd 外的任意一个字符
[a-c]a 和 c 之间的一个字符
[a-cB-Dxyz]a 和 c 之间、B 和 D 之间以及 xyz 中的一个字符
<1-100>1 和 100 之间的整数
<-50>0 和 50 之间的整数
<100->大于 100 的整数
<->任意正整数和 0
([a-c]|<1-100>)a 和 c 之间的一个字符或者 1 和 100 之间的整数

 加强版通配符

Zsh 还支持加强版通配符,功能更多一些。如果使用加强版的通配符,需要先在代码里加上 setopt EXTENDED_GLOB

通配符含义匹配的样例
^abc除了 abc 外的任意字符串aaa
abc^abc以 abc 开头,但后边不是 abc 的字符串abcabd
a*c~abc符合 a*c 但不是 abc 的字符串adc
a#任意数量(包括 0)个 aaaa
b##一个或者多个 bb
(ab)##一个或者多个 ababab
(#i)abc忽略大小写的 abcAbC
(#i)ab(#I)c忽略大小写的 ab 接着 cABc
(#l)aBca 和 c 忽略大小写,但 B 必须大写 的 aBcaBC
(#a1)abc最多错(多或缺也算)一个字符的 abca2c 或 ab 或 abcd

 

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值