Shell 编程(一):Shell 变量的高级用法(一)

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: Shell 编程(一):Shell 变量的高级用法

变量替换

语法 说明
${变量名#匹配规则} 从变量开头进行规则匹配,将符合最短的数据删除
${变量名##匹配规则} 从变量开头进行规则匹配,将符合最长的数据删除
${变量名%匹配规则} 从变量尾部进行规则匹配,将符合最短的数据删除
${变量名%%匹配规则} 从变量尾部进行规则匹配,将符合最长的数据删除
${变量名/旧字符串/新字符串} 变量内容符合旧字符串则,则第一个旧字符串会被新字符串取代
${变量名//旧字符串/新字符串} 变量内容符合旧字符串则,则全部的旧字符串会被新字符串取代

例子

#!/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开

例子

  1. 获取字符串长度
  2. 通过expr获取字符串长度
  3. 获取字符索引位置
  4. 获取子串长度
  5. 抽取字符串中的子串
  6. 索引抽取字符串中的子串
#!/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 字符串变量,并给出用户以下选项:

  1. 打印 string 长度
  2. 删除字符串中所有的 Hadoop
  3. 替换第一个 Hadoop 为 Mapreduce
  4. 替换全部 Hadoop 为 Mapreduce

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

思路分析

  1. 将不同的功能模块划分,并编写函数
  2. 实现第一步所定义的功能函数
  3. 程序主流程设置

代码

#!/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


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
3月前
|
Shell
Shell编程(下)
Shell编程(下)
115 1
|
3月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
54 1
|
3月前
|
存储 Java Shell
Shell 变量
10月更文挑战第2天
34 0
|
3月前
|
Shell Linux 开发工具
|
3月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
89 12
|
4月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
127 1
|
2月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
74 2
6种方法打造出色的Shell脚本
|
2月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
81 1