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