shell编程之变量置换

命令替换

取命令结果用。把命令的结果拿出来
[root@linux-server ~]# a=date +%m%d
[root@linux-server ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 29: …linux-server ~]#̲ a=(date +%m-%d)
[root@linux-server ~]# echo $a
12-25

#反引号亦可用$() 代替

变量替换

一 ${parameter:-word}
若 parameter 为空或未设置,则用 word 代替 parameter 进行替换,parameter 的值不变,若 parameter 不为空,则不替换,parameter 的值不变
#unset b
#echo ${b:-3}
-3
#echo $b

二 ${parameter:=word}
若 parameter 为空或未设置,则用 word 代替 parameter 进行替换,parameter 的值改变,若 parameter设置了,则不替换,parameter的值不变
#unset b
#echo ${b:=3}
3
#echo $b
3

三 ${parameter:+word}
若 parameter 设置了值,则用 word 代替 parameter 进行替换,parameter 的值不变
#unset b
#echo ${b:+3}

#echo $b

举个例子:
#!/bin/bash
echo “="
echo " 目前的版本有: "
echo " mysql-8.0"
echo " mysql-5.7"
echo " 默认版本为: MySQL-8.0"
echo "
=”
read -p “请输入你要选择的版本” Num
Num=echo ${Num:=8.0}
echo “您选择的版本为$Num,稍后给你安装…”

在这里插入图片描述

变量替换-匹配截取

索引及切片
[root@linux-server ~]# a=12345678
[root@linux-server ~]# echo ${a:5} #从左往右第5位开始截取,留下后三位
678
[root@linux-server ~]# echo ${a:3:4} #从第3位开始截取,留下后四位的,剩下的都不要。
4567
[root@linux-server ~]# echo ${a:2:-1} #从左往右第2位开始截取,从右往左截取第一位
34567
[root@linux-server ~]# echo ${a:2:-2}
3456

参数解释:
用冒号截取:echo $a: : :
从哪里截取留那里。

脚本案例:
[root@localhost ~]# vim test11.sh
#!/usr/bin/bash
read -s -p "请输入您的11位手机号 " phone
echo
echo “你的手机号是 $phone”
echo “手机号后四位是 ${phone:7}”

匹配截取
语法:
${变量#关键词} 若变量内容从头开始的数据符合『关键词』,则将符合的最短数据切除
${变量##关键词} 若变量内容从头开始的数据符合『关键词』,则将符合的最长数据切除
${变量%关键词} 若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据切除
${变量%%关键词} 若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据切除

参数解释:
*:表示全部字符。
%:最短尾匹配;
%%:最大尾匹配
%:从右往左
#:从左往右

实战
[root@linux-server ~]# url=www.sina.com.cn
[root@linux-server ~]# echo ${#url} #获取变量的长度
15
[root@linux-server ~]# echo ${url} #正常显示变量
www.sina.com.cn

匹配截取
[root@newrain ~]# echo ${url#.} 从前往后匹配到“.”最短匹配
sina.com.cn
[root@newrain ~]# echo ${url##
.} 从前往后匹配到“.”,最长匹配
cn
[root@newrain ~]# echo ${url%.} 从后往前匹配到“.”,最短匹配
www.sina.com
[root@newrain ~]# echo ${url%%.
} 从后往前匹配到“.”,最长匹配
www
[root@newrain ~]# echo ${url#a.} #不加*
www.sina.com.cn
[root@newrain ~]# echo ${url#a.} #加
com.cn

[root@localhost ~]# vim mail.sh
脚本案例:
#!/usr/bin/bash
read -p "请输入你的邮箱 " mail
echo "你的邮箱是 m a i l " e c h o " 你的邮箱服务器是 mail" echo "你的邮箱服务器是 mail"echo"你的邮箱服务器是{mail#@}"
mail_host=${mail#
@}
case $mail_host in
163.com)
echo “网易服务器”
;;
126.com)
echo “126服务器”
;;
qq.com)
echo “qq邮箱”
;;
*)
echo “您输入的邮箱不正确”
exit 2
esac

变量内容的替换
语法
${变量/旧字符串/新字符串} 若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串替代』
${变量//旧字符串/新字符串} 若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串替代』

实战
[root@linux-server ~]# a=123456123789
[root@linux-server ~]# echo ${a/1/} #第一次匹配的被替换
23456123789
[root@linux-server ~]# echo ${a/1/0} #第一次匹配到1替换成0
023456123789
[root@linux-server ~]# echo ${a//1/} #全局的匹配被替换
2345623789
[root@linux-server ~]# echo ${a//1/x} #全局匹配到1替换成x
x23456x23789

例:
file=/dir1/dir2/dir3/my.file.txt
${file#/}: 拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##
/}: 拿掉最后一条 / 及其左边的字符串:my.file.txt
${file#.}: 拿掉第一个 . 及其左边的字符串:file.txt
${file##
.}: 拿掉最后一个 . 及其左边的字符串:txt
${file%/}: 拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/
}: 拿掉第一条 / 及其右边的字符串:(空值)
${file%.}: 拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.
}: 拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
#是去掉左边(在键盘上 # 在 $ 之左边)
% 是去掉右边(在键盘上 % 在 $ 之右边)
单一符号是最小匹配;两个符号是最大匹配(贪婪匹配)。

basename & dirname

basename 命令
basename 是去除目录后剩下的名字,取文件名
例:
[root@linux-server ~]# temp=/home/temp/1.test
[root@linux-server ~]# base=basename $temp
[root@linux-server ~]# echo $base
1.test

dirname 是获取目录名
例:
[root@linux-server ~]# temp=/home/temp/1.test
[root@linux-server ~]# dir=dirname $temp
[root@linux-server ~]# echo $dir
/home/temp