Loading... <h3><span style="font-size: 16px">一、什么是shell</span></h3> <p><span style="font-size: 14px"> shell是为了使用户能够操作应用程序的接口程序。如经常使用的图形界面及命令行界面都是shell。下面来介绍一下bash这个shell的功能。</span></p> <h3><span style="font-size: 16px">二、变量的概念</span></h3> <p><span style="font-size: 14px"> 被命名的内存空间即为变量,Linux中内置了许多变量,我们可以通过修改这些变量的值还制定用户自己的bash环境。</span></p> <p><span style="font-size: 14px"> 1、显示变量</span></p> <p><img title="1429078217121265.png" src="//cto.wang/usr/uploads/2016/07/20160703160129-36.png" alt="1.png" /></p> <p><span style="font-size: 14px"> 使用echo命令来读出变量的内容,PATH是变量的名称,在前面加上$表示读取变量的内容,否则只会显示字串本身,如下所示;</span></p> <p><span style="font-size: 14px"><img title="1429078412122969.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-64.png" alt="2.png" /></span></p> <p><span style="font-size: 14px"> 也可以使用下面的方式来读取变量的内容;</span></p> <p><span style="font-size: 14px"><img title="1429078471420444.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-6.png" alt="3.png" /></span></p> <p><span style="font-size: 14px"> 2、设置自定义变量</span></p> <p><span style="font-size: 14px"> 我们也可以自己来设置自定义变量,通过“=”号即可实现;</span></p> <p><span style="font-size: 14px"><img title="1429078660100633.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-30.png" alt="4.png" /></span></p> <p><span style="font-size: 14px"> 3、取消变量</span></p> <p><span style="font-size: 14px"><img title="1429080273909086.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-70.png" alt="8.png" /></span></p> <h3><span style="font-size: 16px">三.变量的类型</span></h3> <p><span style="font-size: 14px"> Linux存在多种不同类型的变量,下面逐一介绍。</span></p> <p><span style="font-size: 14px"> 1、本地变量</span></p> <p><span style="font-size: 14px"> 只对当前shell进程有效,对其它shell进程和当前shell进程的子进程无效的变量;</span></p> <p><span style="font-size: 14px"><img title="1429079521707713.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-52.png" alt="5.png" /></span></p> <p><span style="font-size: 14px"> 变量的设置规则:</span></p> <p><span style="font-size: 14px"> 变量的命名应遵循以下原则:</span></p> <p><span style="font-size: 14px"> 1、只能包含字母语、数字和下划线,并且不能以数字开头;</span></p> <p><span style="font-size: 14px"> 2、不应该跟系统中已有的环境变量重名;</span></p> <p><span style="font-size: 14px"> 3、最好做到见名知义;</span></p> <p><span style="font-size: 14px"> 变量中的引用:</span></p> <p><span style="font-size: 14px"> "":弱引用,里面的变量会被替换;</span></p> <p><span style="font-size: 14px"><img title="1429079979134055.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-4.png" alt="6.png" /></span></p> <p><span style="font-size: 14px"> '':强引用,里面的所有字符都是字面量,直接输出;</span></p> <p><span style="font-size: 14px"><img title="1429080014124700.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-39.png" alt="7.png" /></span></p> <p><span style="font-size: 14px"> 2、环境变量</span></p> <p><span style="font-size: 14px"> 环境变量是Linux系统中内置的变量,用于帮助用户设置提示符、文件查找的路径、语系等功能;环境变量作用于当前shell进程及其子进程,对其它的shell无效。</span></p> <p><span style="font-size: 14px"> 1)查看当前系统上的环境变量</span></p> <p><span style="font-size: 14px"> (1)用evn查看环境变量</span></p> <p><span style="font-size: 14px"><img title="1429080864254262.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-42.png" alt="1.png" /></span></p> <p><span style="font-size: 14px"> 上面的结果中有些常用的环境变量说明如下:</span></p> <p><span style="font-size: 14px"> HOSTNAME:主机名;</span></p> <p><span style="font-size: 14px"> SHELL:当前环境中使用的shell程序;</span></p> <p><span style="font-size: 14px"> HISTSIZE:记录历史命令的条数,默认为1000;</span></p> <p><span style="font-size: 14px"> USER:当前用户名;</span></p> <p><span style="font-size: 14px"> MAIL:当前用户的邮箱路径;</span></p> <p><span style="font-size: 14px"> PATH:命令查找路径;</span></p> <p><span style="font-size: 14px"> LANG:当前语系设置;</span></p> <p><span style="font-size: 14px"> HOME:当前用户的家目录。</span></p> <p><span style="font-size: 14px"> (2)使用export命令查看环境变量</span></p> <p><span style="font-size: 14px"><img title="1429081620421504.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-43.png" alt="2.png" /></span></p> <p><span style="font-size: 14px"> (3)使用printenv命令查看环境变量</span></p> <p><span style="font-size: 14px"><img title="1429081836131621.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-25.png" alt="3.png" /></span></p> <p><span style="font-size: 14px"> (4)使用set命令查看所有变量 </span><img title="1429081414436931.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-40.png" alt="1.png" /></p> <p><span style="font-size: 14px"> (5)将自定义变量转换成环境变量 </span></p> <p><span style="font-size: 14px"> 脚本在执行时会启动一个子shell进程,而父进程就会处于睡眠状态,等子进程执行完成后再回到父进程继续执行;父进程处于睡眠状态时,子进程不会继承父进程的本地变量,只会继承环境变量,所以必须将脚本中涉及到的本地变量转换成环境变量才能顺利执行。</span></p> <p><span style="font-size: 14px"> 使用export命令来导出自定义变量为环境变量;</span></p> <p><span style="font-size: 14px"><img title="1429082998415157.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-55.png" alt="5.png" /></span></p> <p><span style="font-size: 14px"> 也可直接使用export命令来直接定义环境变量;</span></p> <p><span style="font-size: 14px"><img title="1429083105244902.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-61.png" alt="6.png" /></span></p> <p><span style="font-size: 14px"> (6)修改环境变量</span></p> <p><span style="font-size: 14px"> 在命令行修改环境变量并不能永久生效,一旦退出shell修改就会失效。</span></p> <p><span style="font-size: 14px"> 与自定义变量的定义方式相同,可以直接为环境变量赋值;</span></p> <p><span style="font-size: 14px"><img title="1429083995608050.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-9.png" alt="1.png" /></span></p> <p><span style="font-size: 14px"> 也可以在环境变量后面追加内容; </span></p> <p><span style="font-size: 14px"><img title="1429084127847541.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-78.png" alt="2.png" /></span></p> <p><span style="font-size: 14px"> 自定义提示符 </span></p> <p><span style="font-size: 14px"><img title="1429084252491219.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-10.png" alt="3.png" /> PS1定义了当前shell中的提示符信息,参数含义如下:</span></p> <p><span style="font-size: 14px"> \u:当前用户名</span></p> <p><span style="font-size: 14px"> \h:主机名</span></p> <p><span style="font-size: 14px"> \H:FQDN,完整格式主机名</span></p> <p><span style="font-size: 14px"> \w:当前工作目录的基名</span></p> <p><span style="font-size: 14px"> \W:当前工作目录的绝对路径</span></p> <p><span style="font-size: 14px"> \$:提示符</span></p> <p><span style="font-size: 14px"> \t:显示时间</span></p> <p><span style="font-size: 14px"><img title="1429084485710689.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-86.png" alt="1.png" /></span></p> <p><span style="font-size: 14px"> 3、局部变量</span></p> <p><span style="font-size: 14px"> 对shell脚本中某代码片断有效:通常用于函数本地;</span></p> <p><span style="font-size: 14px"> 定义方法:local VARNAME=VALUE</span></p> <p><span style="font-size: 14px"> 4、位置变量</span></p> <p><span style="font-size: 14px"> $1,$2,…,${10}</span></p> <p><span style="font-size: 14px"> 5、特殊变量</span></p> <p><span style="font-size: 14px"> $?:上一个命令的执行状态返回值</span></p> <p> </p> <p><span style="font-size: 14px"> $#:参数个数</span></p> <p><span style="font-size: 14px"> $*:参数列表</span></p> <p><span style="font-size: 14px"> $@:参数列表</span></p> <p><span style="font-size: 14px"> 6、只读变量:</span></p> <p><span style="font-size: 14px"> readonly VARNAME</span></p> <h3><span style="font-size: 16px">四、变量的删除与替换</span></h3> <p><span style="font-size: 14px"> 将路径赋值到变量p中;</span></p> <p><span style="font-size: 14px"><img title="1429117037101876.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-14.png" alt="1.png" /></span></p> <p><span style="font-size: 14px"> ${variable#word}:在variable中存储字串上,自左而右,查找第一次出现的word,删除字符开始至此word处的所有内容;</span></p> <p><img title="1429117160133847.png" src="//cto.wang/usr/uploads/2016/07/20160703160130-30-1.png" alt="2.png" /></p> <p><span style="font-size: 14px"> 上面的结果表示从左向右查找第一次出现的/,并将其删除; </span></p> <p><span style="font-size: 14px"> ${variable##word}:在variable中存储字串上,自左而右,查找最后一次出现的word,删除字符开始至此word处的所有内容;</span></p> <p><span style="font-size: 14px"><img title="1429117257420635.png" src="/upload/zzcckixpbyv.png" alt="3.png" /></span></p> <p><span style="font-size: 14px"> 上面的结果表示从左向右查找最后一次出现的/,前面的*代表任何字符; </span></p> <p><span style="font-size: 14px"> ${variable%word}:在variable中存储字串上,自右而左,查找第一次出现的word,删除word开始到尾部的所有内容;</span></p> <p><span style="font-size: 14px"><img title="1429117376383298.png" src="/upload/gbml1tgpnsl.png" alt="4.png" /></span></p> <p><span style="font-size: 14px"> 上面的结果表示从右向左查找第一个/,并将其后面的内容删除; </span></p> <p><span style="font-size: 14px"> ${variable%%word}:在variable中存储字串上,自右而左,查找最后一次出现的word,删除word开始到尾部的所有内容;</span></p> <p><span style="font-size: 14px"><img title="1429117575563820.png" src="/upload/qmiws0nlr4l.png" alt="5.png" /></span></p> <p><span style="font-size: 14px"> 上面的结果表示从右向左查找最后一个/s,并将其后面的内容删除。</span></p> <p><span style="font-size: 14px"> 变量的查找替换:</span></p> <p><span style="font-size: 14px"> ${variable/pattern/substi}:将变量中第一次出现的pattern替换为substi;</span></p> <p><span style="font-size: 14px"><img title="1429496675984136.png" src="/upload/fyzgvfzs4ke.png" alt="1.png" /></span></p> <p><span style="font-size: 14px"> 将第一次出现的123替换为321;</span></p> <p></p> <p><span style="font-size: 14px"><img title="1429496771779294.png" src="/upload/4ncfwwbozgc.png" alt="2.png" /></span></p> <p><span style="font-size: 14px"> ${variable//pattern/substi}:将变量中出现的所有的pattern替换为substi;</span></p> <p><span style="font-size: 14px"><img title="1429496835807483.png" src="/upload/5o32gxx3k0n.png" alt="3.png" /></span></p> <p><span style="font-size: 14px"> ${variable/#pattern/substi}:将变量中位于行首的pattern替换为substi;</span></p> <p><img title="1429497063319365.png" src="/upload/k5ypu5sz3wf.png" alt="4.png" /></p> <p><span style="font-size: 14px"> 上面的变量并没有被替换,因为23并是位于行首的字符;</span></p> <p><span style="font-size: 14px"><img title="1429497143509106.png" src="/upload/xbvtyi2lkqj.png" alt="5.png" /></span></p> <p><span style="font-size: 14px"> 从上面的结果看出只替换了行首的字符;</span></p> <p><span style="font-size: 14px"> ${variable/%pattern/substi}:将变量中位于行尾的pattern替换为substi;</span></p> <p><span style="font-size: 14px"><img title="1429497262328418.png" src="/upload/1ddrcvai4hs.png" alt="6.png" /></span></p> <p><span style="font-size: 14px"> pattern可以使用globbing中的元字符:</span><span style="font-size: 14px">*,?</span></p> <p><span style="font-size: 14px"><img title="1429497366456390.png" src="/upload/jwzoj5cia1k.png" alt="7.png" /></span></p> <p><span style="font-size: 14px"> 变量的查找删除:</span></p> <p><span style="font-size: 14px"> ${variable/pattern}:删除pattern第一次匹配到的字符串;</span></p> <p><span style="font-size: 14px"><img title="1429497687120867.png" src="/upload/i5zzsasowj1.png" alt="8.png" /></span></p> <p><span style="font-size: 14px"> ${variable//pattern}:删除pattern所有匹配到的字符串;</span></p> <p><span style="font-size: 14px"><img title="1429497834344016.png" src="/upload/ybyu3i4p44j.png" alt="9.png" /></span></p> <p><span style="font-size: 14px"> ${variable/#pattern}:删除pattern匹配到的行首的字符串;</span></p> <p><span style="font-size: 14px"><img title="1429497882127792.png" src="/upload/qpjh14hgxq0.png" alt="10.png" /></span></p> <p><span style="font-size: 14px"> ${variable/%pattern}:删除pattern匹配到的行尾字符串;</span></p> <p><span style="font-size: 14px"><img title="1429497926265422.png" src="/upload/okcqvjcqxdt.png" alt="11.png" /></span></p> <p><span style="font-size: 14px"> 大小写转换:</span></p> <p><span style="font-size: 14px"> 小写转大写:${variable^^}</span></p> <p><span style="font-size: 14px"><img title="1429498324827502.png" src="/upload/mcamu3rkqhs.png" alt="12.png" /></span></p> <p><span style="font-size: 14px"> 大写转小写:${variable,,}</span></p> <p><span style="font-size: 14px"><img title="1429498399120478.png" src="/upload/baosrrt5ijj.png" alt="13.png" /></span></p> <p><span style="font-size: 14px"> 变量赋值操作:</span></p> <p><span style="font-size: 14px"> ${parameter:-word}:如果parameter为空或未定义,则返回为“word";否则,返回parameter的值;</span></p> <p><span style="font-size: 14px"><img title="1429498701923915.png" src="/upload/h3xd2yo0aq3.png" alt="14.png" /></span></p> <p><span style="font-size: 14px"> 因为变量p有值,直接显示变量p的的内容;</span></p> <p></p> <p><span style="font-size: 14px"><img title="1429498747518934.png" src="/upload/ptonehnnnia.png" alt="15.png" /></span></p> <p><span style="font-size: 14px"> 将变量p撤消,即显示表达式后面的内容;</span></p> <p><span style="font-size: 14px"> ${parameter:+word}:如果parameter为空或未定义,则不做任何操作;否则,返回word的值;</span></p> <p><span style="font-size: 14px"><img title="1429498854833375.png" src="/upload/cafhzaudr3f.png" alt="16.png" /></span></p> <p><span style="font-size: 14px"> 此表达式正上面的正好相反,将变量p赋值后显示表达式后面的字符,即tt;</span></p> <p><span style="font-size: 14px"> ${parameter:=word}:如果parameter为空或未定义,不但变量返回"word";而且将parameter赋值为word;</span></p> <p><span style="font-size: 14px"><img title="1429498988916203.png" src="/upload/v0i0x3hte2s.png" alt="17.png" /></span></p> <p><span style="font-size: 14px"> 变量p中有值时,直接显示变量p的值,变量p不存在时,将tt赋值给变量p;</span></p> <p><span style="font-size: 14px"> ${parameter:offset:length}:如果将parameter偏移offset个字符,并截取length长度的字符</span></p> <p><span style="font-size: 14px"><img title="1429499168233873.png" src="/upload/x1ngd2gbqyz.png" alt="18.png" /></span></p> <p><span style="font-size: 14px"> 在上面的表达式中,设置了偏移3个字符,即从第4个字符开始显示,截取2个字符,所以结果为45;</span></p> <p><span style="font-size: 14px"> ${parameter:?word}:如果parameter为空或未定义,则将word做为错误信息显示,否则显示parameter的值;</span></p> <p><span style="font-size: 14px"><img title="1429500440105723.png" src="/upload/dbvew4ojuvc.png" alt="19.png" /></span></p> <p><span style="font-size: 14px"> 为脚本使用配置文件,并确保某变量有可用值的方式:</span></p> <p><span style="font-size: 14px"> variable=${variable:-default vaule}</span></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信