- 一 变量的赋值
如图 其中等号即为赋值符号,左边的GODDOG则是自定义变量,而右边的PATH是系统环境变量,图中即将PATH的值赋与GODDOG.
当然也可以使用任意字符串来定义变量,如图 这里,用双引号括起来的部分包括字符串my name及环境变量PATH,那么变量GODDOG的值就是它们连起来。使用双引号时,如果内容中有命令(要反引号)、变量、特殊转义符等,会先把变量、命令、转义字符解析出结果,然后再输出最终内容,这称为弱引用。
但是用单引号括起来的字符串则会将单引号内的所有內容都原样输出,也就是单引号里面看到的是什么就会输出什么,这称为强引用,如图
还有一种,则是反引号,效果则是先执行反引号中的命令,与$()作用相同,如图即将ls命令的结果赋予变量。
- 二 变更为全局变量
使用export命令,可以将你自定义的局部变量变更为全局变量,这样在该shell及其子shell中,这个变量都可以引用。但是要注意的是,在其子shell中对这个变量的删除和更改不会体现在父shell中,另外,这个全局变量会随着定义其的shell的关闭而消失。
如图,自定义局部变量在其子shell中不可见使用export命令后,在其子shell中可见了 若要定义开机即生效的环境变量,则需要将变量定义写入这些文件中,其中前两个一般在你的用户的家目录,只对该用户生效,而/etc/profile则对所有用户生效。 - 三 自定义变量的删除
使用unset命令加变量名即可删除变量 - 四 自定义变量内容的更改
从左往右删,可以使用#和##这两个符号,它们分别代表最短匹配和最长匹配。
例如图中我准备从左往右,将第一个sbin及之前的部分全部删了,所以第三行划线处的命令中${}中即匹配部分,PATH即原变量,#表明从左到右的最短匹配,*表示0至无穷多个任意字符,而sbin则是要匹配的字符串,那么结果就是从左到右一直删除到第一个sbin处。
而最长匹配则是使用的##,从左到右一直删除到最后一个sbin处
类似的还有%和%%,不同的是,它们是从右向左删除。
从右向左,匹配到sbin处都被删除了,还有,注意到了花括号中*的位置了吗,它换到了sbin的右边,因为它现在用来代表从右到左sbin右边的所有字符啊。
这次使用%%符号,将从右到左一直到最后一个匹配 的sbin的所有内容都删除了。
接下来则是关键字替换,我们使用这样的模式,${变量名/旧字符串/新字符串}是替换匹配到的第一个字符串,${变量名//旧字符串/新字符串}则是替换匹配到的所有字符串。
图中第一个命令只替换了第一个匹配的usr,而第二次则替换了所有的usr。
需要注意的是,我们前面所使用的echo命令所有反应出来的更改只针对打印的结果,而非自定义变量,那么要改变自定义变量的值怎么办呢,使用=将更改过后的值赋予其即可。
- 五 变量的测试后赋值
有时候我们想要知道一个变量是否已经定义,并且它的值是否是我们想要的值,如果不是就同时改变它,那么这时候我们会怎么做呢。 使用echo命令是一个简单的办法,但是我们要注意的是,echo输出空行的时候变量也不一定就是未定义,还有可能变量的值是空字符串。那么这时候我们就可以选择使用“+ - = ?”这几个符号了。
注意以下表达式中的冒号“:”,如果有它那么变量值是空字符串的当作未定义处理,没有的话变量值是空字符串的当作已定义处理。
表达式var=${str-expr}或var=${str:-expr},当变量str未定义时表达式值(即var)为expr,变量str已定义时表达式值(即var)为str 。
表达式var=${str+expr}或var=${str:+expr},当变量str未定义时表达式值(即var)设置为空字符串,变量str已定义时表达式值(即var)为expr。看上图,第一次划红线处,str未定义而var的值是exist,这时等号右边的表达式值是空字符串并且赋予左边的变量var,由第二处划红线的表达式可以判断,现在var已经变成了空字符串。这样对比来看更清楚
这是str已定义的情况
注:加号和减号都不会改变原来的变量(即str)的值
表达式var=${str=expr}或var=${str:=expr},当变量str未定义时,str及表达式值(即var)都为expr。变量str已定义时,str的值不变,表达式值(即var)为str。
这可以用来判断并赋值
表达式var=${str?expr}或var=${str:?expr},当变量str未定义时,在标准错误输出流(即stderr)输出expr。变量str已定义时,表达式值(即var)为str。