1.使用字符串的时候会使用到字符串的长度
有如下两种方法
语法 说明
方法一 ${#string} 无
方法二 expr length "$string" string有空格,则必须加双引号
举例说明:
~$ var1="Hello World"
~$ len=${#var1}
~$ echo $len
11
#因 var1 中有空格,所以在使用$的时候一定要加上双引号 "" 无可个可以不适用双引号
~$ var1="Hello World"
~$ len=`expr length "$var1"` # 其中 ` 为tab建上方按键的 ` 并非 enter键左面的单引字符'
~$ echo $len
11
2.获取字串再字符串中的索引位置 index在shell脚本中使用的不多
语法 expr index $string $substring
举例说明:
~$ var1="quicstart is a app"
~$ ind=`expr index "$var1" app`
~$ echo $ind
7
从上面的结果看,怎么会是7 不应该是十五吗? 那是因为shell 会将后面的 app 才分成单个字符 a . p .p 而且当第一个字符匹配到的时候就会返回,
3.获取子串的长度 match在shell脚本中使用的不多,
语法 expr match $string substr
举例说明:
~$ var1="quicstart is a app"
~$ length_sub=`expr match "$var1" app`
~$ echo $length_sub
0
返回了是0 ,这是因为shell 匹配的时候必须从头开始匹配从中间开始匹配则不进行匹配.
可以查看如下案例:返回的位子是3 是因为从头开始匹配到了第三个
~$ length_sub=`expr match "$var1" qui`
~$ echo $length_sub
3
如下是整个 var1字符串的长度
~$ length_sub=`expr match "$var1" qui.*`
~$ echo $length_sub
18
4.抽取子串
语法 说明
方法一 ${string:position} 从string 中的position开始
方法二 ${string:position:length} 从position开始,匹配长度length
方法三 ${string: -position}#:和-号中间有空格 从右边开始匹配
方法四 ${string:(-position)} 从左边开始匹配
方法五 expr substr $string $postion $length 从position开始,匹配长度为length
举例说明:
使用${string:position} 是从 position开始不包含当前位子 索引冲0开始
#提取不包含当前位子
~$ var1="quicstart is a app"
~$ var2=${var1:10}
~$ echo $var2
is a app
从position开始截取长度为7个字符
~$ var1="quicstart is a app"
~$ var2=${var1:10:7}
~$ echo $var2
is a ap
从字符串的 倒数第10个开始 截取到结尾
~$ var1="quicstart is a app"
~$ var2=${var1: -10} #注意 : 和 -之间有空格
~$ echo $var2
t is a app
从字符串的 第10个开始 截取到结尾
~$ var1="quicstart is a app"
~$ var2=${var1:(-10)}
~$ echo $var2
t is a app
从字符串的 第10个开始 向后截取的长度为3 使用expr substr 索引位子从1开始
~$ var1="quicstart is a app"
~$ var2=`expr substr "$var1" 10 3`
~$ echo $var2
is
练习案例:
#!/bin/bash
string="Bingdata process framework is Hadoop,Hadoop is an open source project"
function print_tips
{
echo "***************************"
echo "(1)打印字符串长度"
echo "(2)删除字符串中所有的Hadoop"
echo "(3)替换第一个Hadoop为Mapreduce"
echo "(4)替换全面的Hadoop为Mapreduce"
echo "***************************"
}
function len_of_string
{
echo -e "字符串长度为:${#string}\n"
}
function del_hadoop
{
echo -e "删除后的结果为:${string//Hadoop/}\n"
}
function rep_mapreduce_first
{
echo -e "替换第一个的结果:${string/Hadoop/Mapreduce}\n"
}
function rep_mapreduce_all
{
echo -e "全部替换的结果为:${string//Hadoop/Mapreduce}\n"
}
while true
do
echo "[string=$string]"
read -p "请输入你的选择(1|2|3|4|q|Q):" choice
echo -e "\n"
case $choice in
1)
len_of_string
;;
2)
del_hadoop
;;
3)
rep_mapreduce_first
;;
4)
rep_mapreduce_all
;;
q|Q)
exit
;;
*)
echo "输入选项错误,请重新输入!!!"
;;
esac
done