介绍之前我们已经依次讲了zsh下五个变量(字符串、数组、哈希表、整数、浮点数)的基本用法。不过在变量的使用上还有一些比较高级的内容,对于一些特殊的场景很有帮助。typeset命令typeset命令用于详细设置变量。我们以前在哈希表中见过它。typeset-A可用于定义哈希表。%typeset-Ahashmap=(aabbccdd)但是我们后面会用到local,因为local的作用和hashmap是一样的(除了不能用-f和-g,这两个选项不常用),而且更短更容易进入。此处提到typeset命令是因为名称很好地反映了它的作用。但是知道了这些,我们就可以继续使用本地命令了,毕竟是一样的。typeset命令有很多选项,可以作用于变量,产生各种效果。强制字符串内容为小写或大写#强制字符串内容为小写%local-lstr=abcABC&&echo$strabcabc#强制字符串内容为大写%local-ustr=abcABC&&echo$strABCABC设置变量totheenvironmentvariable%local-xstr=abc#通常使用export,作用是一样的%exportstr=abc环境变量可以被子进程读取。设置变量为只读变量%local-rstr1=abc#平时用readonly,作用是一样的%readonlystr2=abc%str1=bcdzsh:只读变量:str1%str2=bcdzsh:read-onlyvariable:str2设置数组不包含重复元素%local-Uarray=(aabbaacc)&&echo$arrayaabbcc设置整数的位数#如果位数不够则输出填充0%local-Z3i=5&&echo$i005#如果超出范围,将被截断%local-Z3i=1234&&echo$i234baseconversion设置整数为其他base显示:%local-i16i=255%echo$i16#FF可以设置2到36之间的任意基数。设置小数显示不影响计算,只是显示格式不同。使用[#n]num将十进制数显示为n基:%echo$(([#16]255))16#FF可以使用n#num将n基整数显示为十进制:%echo$((16#ff))255我们可以定义一系列函数来快速转换base,而不需要使用bc等外部命令:0x(){echo$((16#$1))}0o(){echo$((8#$1))}0b(){echo$((2#$1))}p16(){echo$(([#16]$1))}p8(){echo$(([#8]$1))}p2(){echo$(([#2]$1))}#otherbasetodecimal%0xff255%0b110113#decimaltootherbase%p16123416#4D2同时给多个变量赋同一个值%local{i,j,k}=123%echo$i$j$k123123123绑定字符串和数组%local-TDIRdir%dir=(/a/b/c/b/d/e/f)%echo$DIR/a:/b/c:/b/d:/e/f#删除dir后,DIR也会被删除(反之亦然)%unsetdir%echo$+DIR0Linux经常需要处理delimited冒号分隔的字符串(例如$PATH)。如果只修改其中一个字段,会很麻烦。local-T可以将一个字符串绑定到一个数组上,这样如果直接修改数组,字符串的内容也会同步改变(反之亦然)。其实在zsh中,$PATH字符串是绑定在$path数组上的,可以直接修改$path来达到修改$PATH的目的,在某些场景下会方便很多。显示变量是如何定义的应该加引号用过bash的读者可能会对里面的双引号印象比较深刻。很多地方不加双引号会出错。为了避免出错,很多人在每个变量的左右加上双引号。请不要担心,代码看起来也很乱。其实在zsh中是不存在这些问题的。变量两边不需要加双引号,不会出现莫名其妙的错误。但是有些地方还是需要加双引号。需要双引号的场景:当代码中出现类似“aabb\t\n*”这样包含字符或特殊符号的字符串时,两边都要加上双引号,基本不用解释。使用$()调用命令时,如果要将结果处理成字符串,需要加双引号,"$()",否则,如果命令结果中有空格,$()将扩展为多个字符的字符串。如果想把数组当作单个字符串,需要加上双引号,array=(ab);打印-l“$数组”。其他本来就不是单串的东西需要转成单串,必须加上双引号。其余情况通常不需要加双引号,典型情况:在任何情况下,字符串变量两边都不需要加双引号,无论里面的内容多么特殊,或者是否变量存在与否,无所谓,比如$str。如果您不进行类型转换(例如将数组转换为字符串),则无需在任何变量周围添加双引号。$1$2$*这些参数(其实也是单个字符串),不需要加双引号,不管内容是什么,参数是否存在。以上7种情况几乎涵盖了所有场景。有的话就试一下(让内容包含空格,换行,以及其他特殊字符等,看结果是否符合预期)。小结本文简单介绍一些常用的排版(或本地)命令的用法。typeset命令还有很多其他的参数,但是一般很少用到,以后会继续更新。参考http://www.bash2zsh.com/zsh_r...http://www.linux-mag.com/id/1...更新历史20170831:添加“哪里应该加双引号”这篇文章是不再更新,全系列文章更新维护在这里:github.com/goreliu/zshguideWindows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua等领域相关问题的付费解决方案,灵活定价,欢迎咨询,微信ly50247。
