简介我们已经学会了字符串、数组、哈希表、整数、浮点数的基本用法,但是我们仍然无法应对一些复杂的场景。变量修饰符是zsh中一个非常独特的概念。对变量的操作类似于函数中的函数,但使用起来更方便。主要用于一行代码实现复杂的功能。代价是可读性较差,具体如何使用还得自己权衡。也是zsh最有特色的部分之一。变量修饰符主要应用于数组和哈希表,但也有少数可以应用于字符串(整数和浮点数也被视为字符串)。变量修饰符的格式其实在上一篇文章中,已经出现了变量修饰符,只是当时没有详细解释。就像大小写转换的情况一样。%str="ABCDEabcde"#转为大写,(U)和:u效果一样%echo${(U)str}---${str:u}ABCDEABCDE---ABCDEABCDE#switchIn小写,(L)和:l效果一样%echo${(L)str}---${str:l}abcdeabcde---abcdeabcde这里(U),:l等都是变量修饰符。变量修饰符有两种主要形式。${(x)var}${var:x}其中var是变量名,x是一个或多个字母,不同的字母有不同的作用。第二行的冒号也可以是其他符号。${var}与$var基本相同。大括号用于防止变量名中的字符粘在后面的字符上。通常不需要牙套。但是如果使用变量修饰符,花括号是必不可少的(其实在第二种格式下,花括号是可以省略的,但是考虑到可读性和错误提示等因素,还是加上比较好)。变量修饰符可以嵌套。因为带有修饰符的变量仍然是变量,所以可以和普通变量一样对待。%str=abc%echo${(U)str}ABC%echo${(C)${(U)str}}abc%echo${${a:u}:l}abc#可以嵌入两个styles放在一起%echo${(C)${a:u}}Abc这里需要注意的是$后面不能有空格,否则会出现语法错误。也就是说不能加空格,以免字符挤在一起造成可读性差。但是一旦您熟悉了格式,就更容易识别代码的功能。更复杂的逻辑可以换行写,不必嵌套。了解变量修饰符的用法后,重要的是可以使用哪些变量修饰符。与变量默认值和变量默认值相关的操作(如果读取变量时变量为空或不存在,则使用默认值),变量可以是任何类型。%var=123#如果变量有值,输出变量值%echo${var:-abc}123#如果变量没有值(变量不存在,是空字符串,空数组,空哈希表等),输出abc%echo${varr:-abc}abc%var=""#类似:-,但只有当变量不存在时才会替换为默认值%echo${var-abc}%echo${varr-abc}abc%var=""#类似:-,但是如果变量没有值,则会赋值abc%echo${var:=abc}abc%echo$varabc%var=abc#不管var有没有值,都会赋值123%echo${var::=123}123%echo$var123%var=""#如果var没有值,报错直接%echo${var:?error}zsh:var:error%var=abc#如果var有值,输出123%echo${var:+123}%echo${varr:+123}拼接成astring%array=(aabbccdd)#用换行符拼接%echo${(F)array}aabbccdd#用空格连接%str=$array%echo$straabbccdd#Concatenate%echo${(j:-=:)array}aa-=bb-=cc-=ddstring与其他字符或字符串分割成数组%str=a##b##c##d%array=(${(s:##:)str})%print-l$arrayabcd输出变量类型#注意,如果不加integer和float,都是字符String,但计算时会自动转换类型%integeri=1%floatf=1.2%str=abc%array=(abc)%local-Ahashmap=(k1v1k2v2)%echo${(t)i}${(t)f}${(t)str}${(t)array}${(t)hashmap}integerfloatscalararrayassociationString,arrayorhashtablenestedvalues可以嵌套多层。%str=abcde%echo${${str[3,5]}[3]}e%array=(aabbccdd)%echo${${array[2,3]}[2]}cc#如果只剩下一个元素,则取字符串的字符%echo${${array[2]}[2]}b%local-Ahashmap=(k1v1k2v2k3v3)%echo${${hashmap[k1]}[2]}1将字符串内容作为变量名,然后取值就不需要经过繁琐的eval了。%var=abc%abc=123%echo${(P)var}123对齐或截断数组中的字符串%array=(abcbcdecdefgdefghi)#只取每个字符串的最后两个字符%echo${(l:2:)array}bcdefghi#用空格和右对齐完成字符串%print-l${(l:7:)array}abcbcdecdefgdefghi#用指定字符完成%print-l${(l:7::0:)array}0000abc000bcde00cdefg0defghi#使用指定字符补全,第二个字符只用一次%print-l${(l:7::0::1:)array}0001abc001bcde01cdefg1defghi#左对齐%print-l${(r:7::0::1:)array}abc1000bcde100cdefg10defghi1总结本文只介绍几个常用的变量修饰符,有些没有提到,以后可能会补充。参考http://www.bash2zsh.com/zsh_r...本文不再更新,全系列文章更新维护在这里:github.com/goreliu/zshguideWindows、Linux付费解决方案,Shell,C,C++,AHK,Python,JavaScript,Lua等相关问题,定价灵活,欢迎咨询,微信ly50247。
