以前咱们已经依次讲过 zsh 下的五种变量(字符串、数组、哈希表、整数、浮点数)的基本用法。但变量的使用方面,还有一些比较进阶的内容,这对一些比较特别的场景颇有帮助。linux
typeset 命令用于对变量进行详细的设置。咱们以前在哈希表那篇见过它。typeset -A 能够用来定义哈希表。git
% typeset -A hashmap=(aa bb cc dd)复制代码
但咱们后续都使用 local,由于 local 的功能和 hashmap 是同样的(除了不能用 -f 和 -g,这两个选项不经常使用),而且更短更容易输入。这里提到 typeset 命令,由于这个名称很好地反映了它的功能。但知道了这个后,咱们能够继续使用 local 命令,毕竟它们是同样的。github
typeset 命令有不少选项,能够做用在变量上,起到各类各样的效果。数组
# 强制字符串内容为小写
% local -l str=abcABC && echo $str
abcabc
# 强制字符串内容为大写
% local -u str=abcABC && echo $str
ABCABC复制代码
% local -x str=abc
# 一般使用 export,功能同样
% export str=abc复制代码
环境变量能够被子进程读取。bash
% local -r str1=abc
# 一般使用 readonly,功能同样
% readonly str2=abc
% str1=bcd
zsh: read-only variable: str1
% str2=bcd
zsh: read-only variable: str2复制代码
% local -U array=(aa bb aa cc) && echo $array
aa bb cc复制代码
# 若是位数不够,输出内容会用 0 补全
% local -Z 3 i=5 && echo $i
005
# 若是超出范围会被截断
% local -Z 3 i=1234 && echo $i
234复制代码
设置整数为其余进制显示:微信
% local -i 16 i=255
% echo $i
16#FF复制代码
能够设置 2 到 36 之间任意进制。设置几进制显示,并不影响计算,只是显示格式不一样。ide
用 [#n] num 也能够显示十进制数为 n 进制:函数
% echo $(([#16] 255))
16#FF复制代码
能够用 n#num 来显示 n 进制整数为十进制:ui
% echo $((16#ff))
255复制代码
咱们能够定义一系列函数来快捷地转换进制,不须要使用 bc 等外部命令:spa
0x() {
echo $((16#$1))
}
0o() {
echo $((8#$1))
}
0b() {
echo $((2#$1))
}
p16() {
echo $(([#16] $1))
}
p8() {
echo $(([#8] $1))
}
p2() {
echo $(([#2] $1))
}
# 其余进制转十进制
% 0x ff
255
% 0b 1101
13
# 十进制转其余进制
% p16 1234
16#4D2复制代码
% local {i,j,k}=123
% echo $i $j $k
123 123 123复制代码
% local -T DIR dir
% dir=(/a /b/c /b/d /e/f)
% echo $DIR
/a:/b/c:/b/d:/e/f
# 删除 dir 后,DIR 也会被删除(反之亦然)
% unset dir
% echo $+DIR
0复制代码
Linux 下常常须要处理带分隔符冒号的字符串(好比 $PATH)。若是只修改其中某一个字段,比较麻烦。local -T 能够把字符串绑定到数组上,这样直接修改数组,字符串内容也会同步变化(反之亦然)。其实在 zsh 中,$PATH 字符串就是和 $path 数组绑定的,能够直接经过修改 $path 来达到修改 $PATH 的目的,这在某些场景会方便不少。
% array=(aa bb cc)
% local -p array
typeset -a array=(aa bb cc)
% array+=(dd)
% local -p array
typeset -a array=(aa bb cc dd)复制代码
用过 bash 的读者大概会对里边的双引号印象比较深入,不少地方不加双引号都会出错,为了不出错,不少人每一个变量左右都加上双引号,麻烦不说,代码看起来也比较乱。
其实 zsh 中已经没有那些问题了,变量两边无需加双引号,不会出现莫名其妙的错误。但有些地方仍是须要加双引号的。
须要加双引号的场景:
"aa bb \t \n *"
出如今代码中时,两边要加双引号,这个基本不须要说明。$()
调用命令时,若是但愿结果按一个字符串处理,须要加上双引号,"$()"
,否则的话,若是命令结果中有空格,$()
会被展开成多个字符串。array=(a b); print -l "$array"
。其他状况一般都不须要加双引号,典型的状况:
$str
。$1
$2
$*
这些参数(其实它们也都是单个字符串),都不须要加双引号,不管内容是什么,或者参数是否存在。以上的 7 种状况几乎覆盖了全部场景,若是有没覆盖到的,试一下便可(让里边的内容包含空格、换行和其余特殊字符等等,看看结果是否符合预期)。
本文简单介绍了一些比较使用的 typeset(或者 local)命令的用法,typeset 命令还有不少其余参数,但通常不多用,之后我也会继续更新。
全系列文章地址:github.com/goreliu/zsh…
付费解决 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等领域相关问题,灵活订价,欢迎咨询,微信 ly50247。