博客
关于我
我的shell编程进阶(一)-变量
阅读量:662 次
发布时间:2019-03-15

本文共 2014 字,大约阅读时间需要 6 分钟。

变量替换及字符串操作

一、变量替换规则

在Shell脚本中,$前面的变量可以通过特殊字符进行操作。这些字符用于字符串替换和删除,常见的有井号#、百分号%、斜杠/和其他特殊符号。

1. 从左到右删除或替换变量

  • ${变量名#匹配规则}

    • 从变量开头开始匹配,将符合最短的数据删除。
    • 示例:var1=${variable#ov} 将从variable中删除最短的以ov结尾的数据。
    • 示例:var2=${variable##ov} 将从variable中删除最长的以ov结尾的数据。
  • ${变量名%匹配规则}

    • 从变量尾部开始匹配,将符合最短的数据删除。
    • 示例:var5=${variable_2%to*} 将从variable_2中删除最短的以to开头的数据。

2. 从左到右替换变量

  • ${变量名/旧字符串/新字符串}

    • 如果变量内容符合旧字符串,则第一个旧字符串会被新的字符串取代。
    • 示例:var6=${PATH/bin/BIN} 将将PATH中的第一个bin替换为BIN
  • ${变量名//旧字符串/新字符串}

    • 如果变量内容符合旧字符串,则全部旧字符串会被新的字符串取代。
    • 示例:var7=${PATH//bin/BIN} 将将PATH中的所有bin替换为BIN

3. 删除环境变量

在实际应用中,可以使用unset命令删除环境变量:

unset var1unset var2

二、字符串操作

1. 获取字符串长度

  • 方法一:expr length "$string"
    • 示例:var2="I love you ,Do you love me"; len=$(expr length "$var2"); echo $len
    • 结果值为字符串的字符数,注意在包含空格的情况下需要加上引号。
  • 方法二:${#string}
    • 示例:len=${#var1}; echo $len
    • 适用于不包含空格的字符串。

2. 提取子串

通过expr indexexpr match命令,结合substr函数,可以提取字符串的特定子串。

  • 从左到右提取子串

    • expr index "$string" start 返回子串的起始位置。
    • expr match "$string" pattern substr: 从头开始匹配pattern,提示提取特定的子串。
    • 示例:
      var3="Quickstart is a app"; ind=$(expr index "$var3" start); echo $ind

      ind的值为6

  • 从右到左提取子串

    • 使用expr index "$string" -length获取字符串长度。
    • 示例:
      var5="hello boby,come on"; substr_3=$(expr index "$var5" -length 5); echo $substr_3

      结果为me on

3. 替换字符串中的子串

  • 替换第一个匹配项

    • expr replace "$string" from(旧字符串) to(新字符串)
    • 示例:
      var6=${PATH/bin/BIN}

      bin替换为BIN

  • 替换所有匹配项

    • 使用//符号进行替换。
    • 示例:
      var7=${PATH//bin/BIN}

      PATH中的所有bin替换为BIN

三、用户需求脚本设计

假设用户输入一个初始字符串string="Bigdata process framework is Hadoop,Hadoop is an open source project"

脚本提供以下交互功能:

  • 打印字符串长度。
  • 删除所有Hadoop
  • 替换第一个HadoopMapreduce
  • 替换所有HadoopMapreduce
  • 脚本结构如下:

    #!/bin/bashwhile true do  echo "当前字符串认知:$string"  echo "可选提示(输入1-4或q/Q退出):   1. 打印字符串长度  2. 删除所有Hadoop  3. 替换第一个Hadoop为Mapreduce  4. 替换所有Hadoop为Mapreduce  q. 退出循环"  read -p "请输入你的选择:" choice  case $choice in  1|1)    echo "${#string}"    ;;  2|2)    echo "${string//Hadoop/}"    ;;  3|3)    echo "${string/Hadoop/Mapreduce}"    ;;  4|4)    echo "${string//Hadoop/Mapreduce}"    ;;  q|Q)    exit  *)    echo "输入错误,请从选项中选择"    ;;  esacdone

    通过以上脚本,可以实现对字符串的多种操作,满足实际应用需求。

    转载地址:http://sramz.baihongyu.com/

    你可能感兴趣的文章
    Mysql——深入浅出InnoDB底层原理
    查看>>
    MySQL“被动”性能优化汇总
    查看>>
    MySQL、HBase 和 Elasticsearch:特点与区别详解
    查看>>
    MySQL、Redis高频面试题汇总
    查看>>
    MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
    查看>>
    mysql一个字段为空时使用另一个字段排序
    查看>>
    MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
    查看>>
    MYSQL一直显示正在启动
    查看>>
    MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
    查看>>
    MySQL万字总结!超详细!
    查看>>
    Mysql下载以及安装(新手入门,超详细)
    查看>>
    MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
    查看>>
    MySQL不同字符集及排序规则详解:业务场景下的最佳选
    查看>>
    Mysql不同官方版本对比
    查看>>
    MySQL与Informix数据库中的同义表创建:深入解析与比较
    查看>>
    mysql与mem_细说 MySQL 之 MEM_ROOT
    查看>>
    MySQL与Oracle的数据迁移注意事项,另附转换工具链接
    查看>>
    mysql丢失更新问题
    查看>>
    MySQL两千万数据优化&迁移
    查看>>
    MySql中 delimiter 详解
    查看>>