shell编程(二)
博主名: 李常明 博文地址: http://keep88.blog.51cto.com 此笔记出自老男孩书籍:跟老男孩学linux运维shell编程实战 shell变量知识进阶与实践 1、shell中的特殊位置参数变量:
例如: 1)、$n的使用:n为{1..15} 小技巧: [root@localhosttest]#echo${1..15} $1$2$3$4$5$6$7$8$9$10$11$12$13$14$15 [root@localhosttest]#echoa{1..10} a1a2a3a4a5a6a7a8a9a10#>==利用此技巧可以快速输出有规律的字符串 [root@localhosttest]#pwd /root/test [root@localhosttest]#vimt1.sh [root@localhosttest]#catt1.sh echo$1 [root@localhosttest]#sht1.shtest test [root@localhosttest]#sht1.shzhangsanlisi zhangsan [root@localhosttest]#vimt1.sh [root@localhosttest]#catt1.sh echo$1$2$3 [root@localhosttest]#sht1.shzhangsanwangwulisi zhangsanwangwulisi 需注意: 当参数大于9时,必须用${10} ${11} ${12}.....${15} 使用大括号括起来 2)、$0的使用: [root@localhosttest]#vimt2.sh [root@localhosttest]#catt2.sh echo$0 [root@localhosttest]#sht2.sh t2.sh [root@localhosttest]#sht2.shzhangsan t2.sh 注: 列举两个命令的使用 1)、dirname和basename dirname:获取路径 basename:获取文件名 [root@localhosttest]#dirname/root/test/t1.sh /root/test [root@localhosttest]#basename/root/test/t1.sh t1.sh 3)、$#的使用: [root@localhosttest]#vimt2.sh [root@localhosttest]#catt2.sh echo$# [root@localhosttest]#sht2.shzhangsanlisiwangwutest1test2 5 4)、$* $@ "$*" "$@"的区别: 结合上述概念,举例分析这四个区别: 1)、使用set设置位置参数(同命令行脚本的传参) [root@localhost~]#set--"Iam"smartboy. [root@localhost~]#echo$# 3 [root@localhost~]#echo$1 Iam [root@localhost~]#echo$2 smart [root@localhost~]#echo$3 boy. 2)、测试$*和$@,没有带双引号 [root@localhost~]#echo$* Iamsmartboy. [root@localhost~]#echo$@ Iamsmartboy. 使用for循环输出所有参数: [root@localhost~]#foriin$*;doecho$i;done I am smart boy. [root@localhost~]#foriin$@;doecho$i;done I am smart boy. 3)、测试"$*"和"$@",注意使用了双引号 [root@localhost~]#echo"$*" Iamsmartboy. [root@localhost~]#echo"$@" Iamsmartboy. 使用for输出所有参数: [root@localhost~]#foriin"$*";doecho$i;done Iamsmartboy. [root@localhost~]#foriin"$@";doecho$i;done Iam smart boy. 小结: 回顾开头我们写的概念分析: $*和$@不加引号,输出所有参数,在for语句中,如果有空格分隔的字符串,会拆分输出 $*和$@都加上引号,例"$*""$@",此时区别: $*会将所有参数,作为完整的字符串输出,如上所示 $@会将所有参数,作为独立的单个字符输出,如果有空格分隔的字符串,不会拆分输出,作为独立的单个字符输出. 注释: set和eval命令的使用详解: set可以同命令行一样,可以传参 eval命令:首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时被称为复杂变量 例如: [root@localhost~]#A="catt1.sh" [root@localhost~]#echo$A catt1.sh [root@localhost~]#eval$A#>==此时eval命令对变量进行置换,还执行了其中的命令 Iamsmartboy. set与eval的使用,在编写脚本会用到的例子: 例1)、 [root@localhost~]#Number=$(set--$(catt4.sh);eval"echo$$#") 注释:set设置传入的参数,eval进行两次扫描,$#:输出所有的位置参数总数, $$#:将总数,也就是最后一个位置参数的值,赋值给Number [root@localhost~]#echo$Number 5 例2)、 [root@localhost~]#runlevel N5 [root@localhost~]#Runlevel=$(set--$(runlevel);eval"echo$$#") [root@localhost~]#echo$Runlevel 5 2、shell进程中的特殊状态变量: $?获取执行上一个指令的执行状态返回值(0为成功,非0表示失败) 3、bash Shell内置变量命令: 1)、echo参数
2)、eval命令使用 [root@localhost~]#catt1.sh echo$$# [root@localhost~]#sht1.sharg1arg2 $2#>==$#:输出位置参数总数2$$#:$2echo输出$2 [root@localhost~]#catt1.sh evalecho$$##>==加入eval命令,将echo$5以命令输出结果 [root@localhost~]#sht1.sharg1arg2arg3arg4 arg4 3)、shift shift命令的主要作用是将位置参数$1,$2等进行左移,即如果位置参数是$3,$2,$1,那么执行一次shift后,$3 就变成了$2,$2就变成了$1,$1,就消失了。 例如: [root@localhost~]#catt4.sh echo$1$2 if[$#-eq2];then shift echo$1; fi [root@localhost~]#sht4.sharg1arg2 arg1arg2 arg2#>==执行shift命令后,arg1被左移掉了,剩下了新的$1,即arg2 4、Shell变量字串知识及实践
举例说明各内置变量的使用: 1)、${#parameter} :计算长度 [root@localhost~]#name="lichangming" [root@localhost~]#echo${#name} 11#>==正好11个字符”lichangming“ 2)、${parameter:offset}: 指定位置之后提取内容到结尾,同python中的切片类似 [root@localhost~]#name="lichangming" [root@localhost~]#echo${name:3} hangming [root@localhost~]#echo${name:2} changming 3)、${parameter:offset:length} :从位置offset之后开始提取长度为length的字串 [root@localhost~]#name="lichangming" [root@localhost~]#echo${name:2:7} changmi#>==输出第2个位置之后到第7个位置的内容 注: 此上的截取内容方法,同cut -c命令的功能 例如: [root@localhost~]#echo$name lichangming [root@localhost~]#echo${name}|cut-c2-7 ichang#>==cut命令,后接的数字表示:截取2~7个位置的字符 注意和内置变量的区别,内置变量的第一个offset,起始位置为offset之后的内容 4)、${parameter#word} :从开头开始删除最短匹配word字串 [root@localhost~]#echo$name lichangming [root@localhost~]#echo${name#l*g} ming#>==匹配了l至g范围的字串,将其删除,注意一定是从头开始匹配,最短匹配 [root@localhost~]#echo${name#c*g} lichangming#>==c不是从开头匹配的,所以没有找到匹配项,未删除,输出所有 5)、${parameter##word} :删除从头开始最长匹配 [root@localhost~]#name="lichangmingcming" [root@localhost~]#echo$name lichangmingcming [root@localhost~]#echo${name##l*c} ming#>==最长匹配,匹配了lichangmingc,将其删除,剩下ming 看看最短匹配删除的结果: [root@localhost~]#echo${name#l*c} hangmingcming#>==最短匹配,匹配了lic,删除 以上匹配删除,都是从头开始删除。 6)、${parameter%word}:从末尾删除最短匹配 7)、${parameter%%word}: 从末尾删除最长匹配 例如: [root@localhost~]#echo$name lichangmingcming [root@localhost~]#echo${name%i*g} lichangmingcm [root@localhost~]#echo${name%%i*g} l [root@localhost~]#echo${name%%c*m} lichangmingcming [root@localhost~]#echo${name%%m*g} lichang 注意: 从末尾匹配,指第一个值与末尾g 范围的字串,在上述例子中,c*m,开头为c,中间为任意值,末尾为m,则未找到匹配结果,输出了所有,所以,一定谨记是第一个值与末尾匹配。 8)、${parameter/pattern/string} :将string替换第一匹配到的模式pattern [root@localhost~]#name="li2chang3ming4hehe8" [root@localhost~]#echo$name li2chang3ming4hehe8 [root@localhost~]#echo${name/3*4/test} li2changtesthehe8 9)、${parameter//pattern/string} :将string替换所有匹配到的模式pattern [root@localhost~]#name="zhangsanlisiwangwuzhangsanliming" [root@localhost~]#echo$name zhangsanlisiwangwuzhangsanliming [root@localhost~]#echo${name//zhangsan/someone} someonelisiwangwusomeoneliming 注: 使用以上的方法,批量修改文件名 1)、生成测试文件: [root@localhosttest]#pwd /root/test [root@localhosttest]#ls [root@localhosttest]#touchsmart_t{1..9}.sh [root@localhosttest]#ls smart_t1.shsmart_t3.shsmart_t5.shsmart_t7.shsmart_t9.sh smart_t2.shsmart_t4.shsmart_t6.shsmart_t8.sh 批量改名: 将smart_t*.sh改为silly_t*.sh [root@localhosttest]#ls smart_t1.shsmart_t3.shsmart_t5.shsmart_t7.shsmart_t9.sh smart_t2.shsmart_t4.shsmart_t6.shsmart_t8.sh [root@localhosttest]#foriin`ls*.sh`;domv$i`echo${i//smart/silly}`;done [root@localhosttest]#ls silly_t1.shsilly_t3.shsilly_t5.shsilly_t7.shsilly_t9.sh silly_t2.shsilly_t4.shsilly_t6.shsilly_t8.sh 此方法为使用变量的字串替换 来实现的改名方法。 2)、使用rename命令改名: [root@localhosttest]#rename"smart""silly"/root/test/*.sh [root@localhosttest]#ls silly_t1.shsilly_t3.shsilly_t5.shsilly_t7.shsilly_t9.sh silly_t2.shsilly_t4.shsilly_t6.shsilly_t8.sh 3)、for循环结合sed实现批量改名: [root@localhosttest]#ls silly_t1.shsilly_t3.shsilly_t5.shsilly_t7.shsilly_t9.sh silly_t2.shsilly_t4.shsilly_t6.shsilly_t8.sh [root@localhosttest]#foriin`ls*.sh`;domv$i`echo$i|seds/silly/smart/g`;done [root@localhosttest]#ls smart_t1.shsmart_t3.shsmart_t5.shsmart_t7.shsmart_t9.sh smart_t2.shsmart_t4.shsmart_t6.shsmart_t8.sh (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |