变量替换
语法 | 说明 |
${变量名#匹配规则} | 从变量开头进行规则匹配,将符合最短的数据删除 |
${变量名##匹配规则} | 从变量开头进行规则匹配,将符合最长的数据删除 |
${变量名%匹配规则} | 从变量尾部进行规则匹配,将符合最短的数据删除 |
${变量名%%匹配规则} | 从变量尾部进行规则匹配,将符合最长的数据删除 |
${变量名/旧字符串/新字符串} | 变量内容符合旧字符串则,则第一个旧字符串会被新字符串取代 |
${变量名//旧字符串/新字符串} | 变量内容符合旧字符串则,则全部的旧字符串会被新字符串取代 |
例子
#!/bin/bash # var1 = I love you,Do you love me var1="I love you,Do you love me"; echo "var1 = ${var1}"; # ${变量名#匹配规则} var2 = e you,Do you love me var2=${var1#*ov} echo "var2 = ${var2}"; # ${变量名##匹配规则} var3 = e me var3=${var1##*ov} echo "var3 = ${var3}"; # ${变量名%匹配规则} var4 = I love you,Do you l var4=${var1%ov*} echo "var4 = ${var4}"; # ${变量名%%匹配规则} var5 = I l var5=${var1%%ov*} echo "var5 = ${var5}"; # ${变量名/旧字符串/新字符串} var6 = I like you,Do you love me var6=${var1/love/like} echo "var6 = ${var6}"; # ${变量名//旧字符串/新字符串} var7 = I like you,Do you like me var7=${var1//love/like} echo "var7 = ${var7}"; #!/bin/bash
变量测试
变量配置方式 | Str没有配置 | Str为空字符串 | Str已配置且非空 |
var=${str-expr} | var=expr | var= | var=$str |
var=${str:-expr} | var=expr | var=expr | var=$str |
var=${str+expr} | var= | var=expr | var=expr |
var=${str:+expr} | var= | var= | var=expr |
var=${str=expr} | var=expr | var | var=$str |
var={str:=expr} | var=expr | var=expr | var=$str |
字符串处理
计算字符串长度
语法 | 说明 | |
方法一 | ${#string} | 无 |
方法二 | expr length “$string” | string 有空格,则必须加双引号 |
获取子串在字符串中的索引位置
语法 | 说明 |
expr index $string $substring | 无 |
抽取子串
语法 | 说明 | |
方法一 | ${string:position} | 从 string 中的 position 开始 |
方法二 | ${string : position:length} | 从 position 开始,匹配长度为 length |
方法三 | ${string: -position} | 从右边开始匹配 |
方法四 | ${string:(position)} | 从左边开始匹配 |
方法五 | expr substr $string $position $length | 从 position 开始,匹配长度为 length |
使用expr,索引计数是从1开始计算;使用${string:position}, 索引计数是从0开
例子
- 获取字符串长度
- 通过expr获取字符串长度
- 获取字符索引位置
- 获取子串长度
- 抽取字符串中的子串
- 索引抽取字符串中的子串
#!/bin/bash # 获取字符串长度 var1="Hello World" echo "var1 = $var1" len=${#var1} echo "var1 len = $len" # 通过expr获取 len=`expr length "$var1"` echo "var1 len = $len" # 获取字符索引位置 index=`expr index "$var1" rld` echo "rld index = $index" index=`expr index "$var1" a1d` echo "a1d index = $index" #获取子串长度(tips:匹配规则是从头开始匹配中间匹配无效) sub_len=`expr match "$var1" rld` echo "rld sub_len = $sub_len" # 从 Hello 开始匹配则可成功 sub_len=`expr match "$var1" Hello` echo "Hello sub_len = $sub_len" # 抽取字符串中的子串 var2="redis mysql pgsql sqlserver" echo "var2 = $var2" # 从 var2 第 10 位开始提取子串 substr1=${var2:10} echo "substr1 = $substr1" # 从 var2 第 10 位开始提取长度为 5 的子串 substr2=${var2:10:5} echo "substr2 = $substr2" # 从 var2 的右边第 5 开始提取子串 substr3=${var2:-5} echo "substr3 = $substr3" substr4=${var2:(-5)} echo "substr4 = $substr4" # 从 var2 的右边第 5 开始提取长度为 5 的子串 substr5=${var2:-5:5} echo "substr5 = $substr5" # 从 5 开始,匹配长度为 10(tips:使用expr,索引计数是从1开始计算;使用${string:position}, 索引计数是从0开) substr6=`expr substr "$var2" 5 10` echo "substr6 = $substr6"
输出
var1 = Hello World var1 len = 11 var1 len = 11 rld index = 3 a1d index = 11 rld sub_len = 0 Hello sub_len = 5 var2 = redis mysql pgsql sqlserver substr1 = l pgsql sqlserver substr2 = l pgs substr3 = redis mysql pgsql sqlserver substr4 = erver substr5 = redis mysql pgsql sqlserver substr6 = s mysql pg
练习
字符串处理脚本
需求描述
变量 string=”Bigdata process framework is Hadoop , Hadoop is an open source project” 执行脚本后,打印输出 string 字符串变量,并给出用户以下选项:
- 打印 string 长度
- 删除字符串中所有的 Hadoop
- 替换第一个 Hadoop 为 Mapreduce
- 替换全部 Hadoop 为 Mapreduce
用户输入数字 1|2|3|4,可以执行对应项的功能;输入q|Q则退出交互模式
思路分析
- 将不同的功能模块划分,并编写函数
- 实现第一步所定义的功能函数
- 程序主流程设置
代码
#!/bin/bash string="Bigdata process framework is Hadoop , Hadoop is an open source project" # 打印文字 function print_tips { echo "-----------------------------" echo "(1).打印 string 长度" echo "(2).删除字符串中所有的 Hadoop" echo "(3).替换第一个 Hadoop 为 Mapreduce" echo "(4).替换全部 Hadoop 为 Mapreduce" echo "-----------------------------" } # 打印 string 长度 function len_of_string { echo ${#string} } # 删除字符串中所有的 Hadoop function del_hadoop { echo ${string//Hadoop/} } # 替换第一个 Hadoop 为 Mapreduce function rep_hadoop_mapreduce_first { echo ${string/Hadoop/mapreduce} } # 替换全部 Hadoop 为 Mapreduce function rep_hadoop_mapreduce_all { echo ${string//Hadoop/mapreduce} } # 主程序 while true; do echo "[string=$string]" print_tips read -p "Pls input you choice(1|2|3|4|q|Q):" choice case $choice in 1) len_of_string ;; 2) del_hadoop ;; 3) rep_hadoop_mapreduce_first ;; 4) rep_hadoop_mapreduce_all ;; q | Q) exit ;; *) echo "Error, input only in(1|2|3|4|q|Q)" ;; esac echo "-----------------------------" done