博客
关于我
我的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 多字段删除重复数据,保留最小id数据
    查看>>
    MySQL 多表联合查询:UNION 和 JOIN 分析
    查看>>
    MySQL 大数据量快速插入方法和语句优化
    查看>>
    mysql 如何给SQL添加索引
    查看>>
    mysql 字段区分大小写
    查看>>
    mysql 字段合并问题(group_concat)
    查看>>
    mysql 字段类型类型
    查看>>
    MySQL 字符串截取函数,字段截取,字符串截取
    查看>>
    MySQL 存储引擎
    查看>>
    mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
    查看>>
    MySQL 存储过程参数:in、out、inout
    查看>>
    mysql 存储过程每隔一段时间执行一次
    查看>>
    mysql 存在update不存在insert
    查看>>
    Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
    查看>>
    Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
    查看>>
    Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
    查看>>
    Mysql 学习总结(89)—— Mysql 库表容量统计
    查看>>
    mysql 实现主从复制/主从同步
    查看>>
    mysql 审核_审核MySQL数据库上的登录
    查看>>
    mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
    查看>>