shell编程系列2--字符串的处理

shell编程系列2--字符串的处理

字符串的处理

1.计算字符串的长度

方法1 ${#string}

方法2 expr length "$string"  (如果string中间有空格,必须加双引号)

例子:
# 通过${#string}获取字符串长度
[root@localhost shell]# var1="hello world"
[root@localhost shell]# len=${#var1}
[root@localhost shell]# echo $len
11
[root@localhost shell]# len=`expr length "$var1"`
[root@localhost shell]# echo $len
11

# expre length "$string"计算字符串长度
[root@localhost shell]# var2="hi shell"
[root@localhost shell]# len=`expr length "$var2"`
[root@localhost shell]# echo $len
8

2.获取子串在字符中的索引位置
语法:expr index $string $substring

例子:
[root@localhost shell]# var1="quickstart is a app"
[root@localhost shell]# inx=`expr index "$var1" start`
[root@localhost shell]# echo $inx
6

# 从下面的例子可以看出来不是找子串的索引位置,而是获取字符的位置,即将 uniq 拆分成 u n i q 4个字符任意找到其中一个字符就返回这个字符的位置
[root@localhost shell]# inx=`expr index "$var1" uniq`
[root@localhost shell]# echo $inx
1

3.获取子串长度
expr match $string substr

例子:
# match语法从头开始匹配字符串,如果从中匹配到了就返回0
[root@localhost shell]# var1="quickstart is a app"
[root@localhost shell]# echo $var1
quickstart is a app
[root@localhost shell]# sub_len=`expr match "$var1" app`
[root@localhost shell]# echo $sub_len
0
[root@localhost shell]# sub_len=`expr match "$var1" quick`
[root@localhost shell]# echo $sub_len
5
[root@localhost shell]# sub_len=`expr match "$var1" quick.*`
[root@localhost shell]# echo $sub_len
19


4.抽取字符串中的子串
方法1 
(1) ${string:position}
(2) ${string:position:length}
(3) ${string:-position} 或者 ${string:(position)}

方法2
expr substr $string $position $length

例子:
var1="kafka hadoop yarn mapreduce"

# 提取var1中索引从10开始一直到结尾的字符串,索引下标从0开始
[root@localhost shell]# var1="kafka hadoop yarn mapreduce"
[root@localhost shell]# 
[root@localhost shell]# echo $var1
kafka hadoop yarn mapreduce
[root@localhost shell]# sub_str1=${var1:10}
[root@localhost shell]# echo $sub_str1
op yarn mapreduce

# 从第10个位置开始提取5个字符串
[root@localhost shell]# sub_str2=${var1:10:5}
[root@localhost shell]# echo $sub_str2
op ya

# 取最后的5位,从-1开始
[root@localhost shell]# sub_str3=${var1: -5}
[root@localhost shell]# echo $sub_str3
educe
[root@localhost shell]# sub_str3=${var1:(-5)}
[root@localhost shell]# echo $sub_str3
educe

# 取从最后开始取两位,注意 var1: -5 之间有空格
[root@localhost shell]# sub_str3=${var1: -5:2}
[root@localhost shell]# echo $sub_str3
ed

# 从10开始提取5位,索引从1开始
[root@localhost shell]# sub_str5=`expr substr "$var1" 10 5`
[root@localhost shell]# echo $sub_str5
oop y

注意:
使用expr,索引计数是从1开始计算
使用${string:position},索引计数是从0开始


练习:

需求描述:
变量 string="Bigdata process framework is Hadoop,Hadoop is an open source project"
执行脚本后,打印输出string字符串变量,并给出用户以下选项:
(1)、打印string长度
(2)、删除字符串中所有的Hadoop
(3)、替换第一个Hadoop为Mapreduce
(4)、替换全部Hadoop为Mapreduce

用户输入数字1|2|3|4,可以执行对应项中的功能;输入q|Q则退出交互模式

思路分析:

1、将不同的功能模块划分,并编写函数、
    function print_tips
    function len_of_string
    function del_hadoop
    function rep_hadoop_mapreduce_first
    function rep_hadoop_mapreduce_all

2、实现第一步所定义的功能函数

    #!/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 "********************************************"
    }

    function len_of_string
    {
        echo "${#string}"
    }

    function del_hadoop
    {
        #  把hadoop替换为空
        echo "${string//Hadoop/}"

    }

    function rep_hadoop_mapreduce_first
    {
        echo "${string/Hadoop/Mapreduce}"
    }

    function rep_hadoop_mapreduce_all
    {
        echo "${string//Hadoop/Mapreduce}"
    }


3、程序主流程的设计
    [root@localhost shell]# cat example.sh 
    #!/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 "********************************************"
    }

    function len_of_string
    {
        echo "${#string}"
    }

    function del_hadoop
    {
        #  把hadoop替换为空
        echo "${string//Hadoop/}"

    }

    function rep_hadoop_mapreduce_first
    {
        echo "${string/Hadoop/Mapreduce}"
    }

    function rep_hadoop_mapreduce_all
    {
        echo "${string//Hadoop/Mapreduce}"
    }

    while true
    do
        echo " 【string=$string】"
        echo
        print_tips
        read -p "Pls input your 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
    done

 

posted @ 2019-05-24 10:07  reblue520  阅读(345)  评论(0编辑  收藏  举报