命令替换
取命令结果用。把命令的结果拿出来
[root@linux-server ~]# a=`date +%m%d`
[root@linux-server ~]# echo $a
1225
[root@linux-server ~]# a=$(date +%m-%d)
[root@linux-server ~]# echo $a
12-25#反引号亦可用$() 代替
变量替换-匹配截取
索引及切片
[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 "你的邮箱是$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