码迷,mamicode.com
首页 > 系统相关 > 详细

Shell脚本编程——字符串变量处理

时间:2016-08-24 01:23:30      阅读:323      评论:0      收藏:0      [点我收藏+]

标签:shell变量字符串切片   shell变量字符串查找替换   shell变量赋值高级方式   shell间接变量引用   

相信正在脚本之路上狂奔的同学们,都能感觉到脚本中需要应用变量的地方非常广泛,简单来看变量也只不过就是:var=value;如果我们深入其中,也能发现变量里面的学问其实也挺深的,今天就给大家分享一下这个小小的变量里面到底有多少的学问吧。Shell变量一般是无类型的,但是bash Shell提供了declare和typeset两个命令用于指定变量的类型,两个命令是完全等价的。

一、高级变量用法——定义有类型变量
declare [选项] 变量名
 -r 将变量设置为只读属性  等同于使用export VAR_NAME
 -i 将变量定义为整型数
 -a 将变量定义为数组
 -f 显示此脚本前定义过的所有函数名及其内容
 -F 仅显示此脚本前定义过的所有函数名
 -x 将变量声明为环境变量
 -l  将变量值转为小写字母
 -u  将变量值转为大写字母

 

二、字符串切片:
 1、${#var}:返回字符串变量var的长度
  示例代码:
  [root@centos7 array]# vara=test12345
  [root@centos7 array]# echo ${vara}
  test12345
  [root@centos7 array]# echo ${#vara}
  9

 2、${var:offset}:返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,offset的取值在0 到 ${#var}-1 之间
      (bash4.2后,充许为负值)
  示例代码:
  [root@centos7 array]# vara=test12345
  [root@centos7 array]# echo ${vara:4}
  12345

 3、${var:offset:number}:返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
  示例代码:
  [root@centos7 array]# vara=test12345
  [root@centos7 array]# echo ${vara:3:4}
  t123

 4、${var: -lengh}:取字符串的最右侧几个字符
     注意:冒号后必须有一空白字符
  示例代码:
  [root@centos7 array]# vara=test12345
  [root@centos7 array]# echo ${vara: -3}
  345
  [root@centos7 array]# echo ${vara: -5}
  12345

 

三、字符串处理
(一)基于模式取子串:
 1、${var#*word}:自左而右,查找var变量所存储的字符串中,第一次出现的word, 删除字符串开头至第一次出现word字符之间的所有字符
  示例代码:
  [root@centos7 array]# vara=test12345
  [root@centos7 array]# echo ${vara#*12}
  345
  [root@centos7 array]# echo ${vara#*es}
  t12345

 2、${var##*word}:同上,不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容
  示例代码:
  [root@centos7 array]# file=/var/log/messages
  [root@centos7 array]# echo ${file##*/}
  messages

 3、${var%word*}:自右而左,查找var变量所存储的字符串中,第一次出现的word, 删除字符串最后一个字符向左至第一次出现word字符之间的所有字符
  示例代码:
  [root@centos7 array]# file=/var/log/messages
  [root@centos7 array]# echo ${file%/*}
  /var/log

 4、${var%%word*}:同上,只不过删除字符串最右侧的字符向左至最后一次出现word字符之间的所有字符
  示例代码:
  [root@centos7 array]# url=http://www.baidu.com:80
  [root@centos7 array]# echo ${url##*:}
  80
  [root@centos7 array]# echo ${url%%:*}
  http

 

(二)查找替换:
 1、${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替换之
  示例代码:
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara/es/00}
  t00t12345test

 2、${var//pattern/substi}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替换之
  示例代码:
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara/es/00}
  t00t12345test
  [root@centos7 array]# echo ${vara//es/00}
  t00t12345t00t

 3、${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替换之
  示例代码:
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara/#te/00}
  00st12345test

 4、${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替换之
  示例代码:
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara/#te/00}
  00st12345test
  [root@centos7 array]# echo ${vara/%st/000}
  test12345te000

 

(三)查找并删除:
 1、${var/pattern}:查找var所表示的字符串中,删除第一次被pattern所匹配到的字符串
  示例代码:
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara/12345}
  testtest

 2、${var//pattern}:查找var所表示的字符串中,删除所有被pattern所匹配到的字符串
  示例代码:
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara//t}
  es12345es
  [root@centos7 array]# file=/var/log/messages
  [root@centos7 array]# echo ${file///}
  varlogmessages

 3、${var/#pattern}:查找var所表示的字符串中,删除行首被pattern所匹配到的字符串
  示例代码:
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara/#test}
  12345test
  [root@centos7 array]# file=/var/log/messages
  [root@centos7 array]# echo ${file/#\/var}
  /log/messages
 
 4、${var/%pattern}:查找var所表示的字符串中,删除行尾被pattern所匹配到的字符串
  示例代码:
  [root@centos7 array]# file=/var/log/messages
  [root@centos7 array]# echo ${file/%ges}
  /var/log/messa
  [root@centos7 array]# vara=test12345test
  [root@centos7 array]# echo ${vara/%test}
  test12345

 

(四)字符大小写转换:
 1、${var^^}:把var中的所有小写字母转换为大写
  示例代码:
  [root@centos7 array]# vara=test
  [root@centos7 array]# echo ${vara^^}
  TEST

 2、${var,,}:把var中的所有大写字母转换为小写
  示例代码:
  [root@centos7 array]# vara=WANGJUN
  [root@centos7 array]# echo ${vara,,}
  wangjun

 

四、变量赋值高级方式
 1、${var:-value}:如果var为空或未设置,那么返回value;否则,则返回var的值
  示例代码:
  [root@centos7 array]# echo ${varb:-100}
  100

 2、${var:+value}:如果var不空,则返回value
  示例代码:
  [root@centos7 array]# varb=wangjun
  [root@centos7 array]# echo ${varb:+100}
  100

 3、${var:=value}:如果var为空或未设置,那么返回value,并将value赋值给var;否则,则返回var的值
  示例代码:
  [root@centos7 array]# varb=wangjun
  [root@centos7 array]# echo ${varb:=100}
  wangjun
  [root@centos7 array]# echo ${varc:=100}
  100

 4、${var:?error_info}:如果var为空或未设置,那么返回error_info;否则,则返回var的值
  示例代码:
  [root@centos7 array]# varb=wangjun
  [root@centos7 array]# echo ${varb:?4}
  wangjun
  [root@centos7 array]# echo ${vard:?4}
  -bash: vard: 4

 

 使用配置文件为脚本程序变量赋值
  (1) 定义文本文件,每行定义“name=value”
  (2) 在脚本中source此文件即可

 

五、间接变量引用
 如果第一个变量的值是第二个变量的名字,从第一个变量引用第二个变量的值就称为间接变量引用
 var1=var2
 var2=value
 var1的值是var2,而var2又是变量名,var2的值为value,间接变量引用是指通过var1获得变量值value的行为

 bash Shell提供了两种格式实现间接变量引用
 eval var3=\$$var1
 var3=${!var1}

  示例代码:

 [root@centos7 useradmin]# var1=user
 [root@centos7 useradmin]# user=test
 [root@centos7 useradmin]# echo $var1
 user
 [root@centos7 useradmin]# eval var3=\$$var1
 [root@centos7 useradmin]# echo $var3
 test

 [root@centos7 useradmin]# var4=${!var1}
 [root@centos7 useradmin]# echo $var4
 test

 

 eval命令
 eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描
  示例代码:
 [root@centos7 useradmin]# prefix=user
 [root@centos7 useradmin]# $num
 bash: 005: command not found...
 [root@centos7 useradmin]# num=005
 [root@centos7 useradmin]# eval "echo $prefix{001..$num}"
 user001 user002 user003 user004 user005


 正在学习脚本的同学们,当你看到这儿的同时,有什么想法吗,相信曾经的困惑被打开了吧,至少当初我自己学到这儿的时候,豁然开朗。

本文出自 “爱情防火墙” 博客,请务必保留此出处http://183530300.blog.51cto.com/894387/1841659

Shell脚本编程——字符串变量处理

标签:shell变量字符串切片   shell变量字符串查找替换   shell变量赋值高级方式   shell间接变量引用   

原文地址:http://183530300.blog.51cto.com/894387/1841659

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!