目录
3.注意事项: 定义或引⽤变量时注意事项: " " 弱引⽤ ' ' 强引⽤
4.``命令替换等价于 $() 反引号中的 shell 命令会被先执⾏(在上个示例中我们已经使用``)
什么是变量:
简单理解:变量就是一个固定的值来表示一个不固定的存在变化的值的简称。
[root@VM-1-12-centos ~]# a=1111
[root@VM-1-12-centos ~]# b=2222
[root@VM-1-12-centos ~]# echo $a
1111
[root@VM-1-12-centos ~]# echo $b
2222
1.变量常见类型
shell变量如下几类分为:
自定义变量
系统环境变量
位置参数变量
预先定义变量
1.自定义变量
- 定义变量 变量名=变量值 ,不允许数字命名, 不能使⽤-命名
- 引⽤变量 $变量名 或 ${变量名}
- 查看变量 echo $变量名 set显示所有变量,包括⾃定义变量和环境变量
- 取消变量 unset 变量名 作⽤范围:仅在当前 shell 中有效
2.系统环境变量
1.定义环境变量 export export 变量 ,将⾃定义变量转换成环境变量
2.引⽤环境变量 $变量名 或 ${变量名}
3.查看环境变量 echo $变量名 env |grep Name
4.取消环境变量 unset 变量名
5.变量作⽤范围 在当前shell和⼦shell有效
3.位置参数变量
脚本参数传参: $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
4.预先定义变量
$0 脚本⽂件名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的 PID
$! 上⼀个后台进程的 PID
$? 上⼀个命令的返回值 0 表示成功
//例, 演示每个参数的作⽤
echo " 第 7 个位置参数是$7"
echo " 第 6 个位置参数是$6"
echo " 第 5 个位置参数是$5"
echo " 第 4 个位置参数是$4"
echo " 第 3 个位置参数是$3"
echo " 第 2 个位置参数是$2"
echo " 第 1 个位置参数是$1"
echo " 所有参数是: $*"
echo " 所有参数是: $@"
echo " 参数的个数是: $#"
echo " 当前进程的 PID 是: $$"
echo '$4='$4
echo '$5='$5
echo '$6='$6
echo '$*='$*
echo '$@='$@
echo '$#='$#
echo '$$='$$
执行后的结果:
[root@VM-1-12-centos ~]# bash yudingyi.sh {a..z}
第 7 个位置参数是g
第 6 个位置参数是f
第 5 个位置参数是e
第 4 个位置参数是d
第 3 个位置参数是c
第 2 个位置参数是b
第 1 个位置参数是a
所有参数是: a b c d e f g h i j k l m n o p q r s t u v w x y z
所有参数是: a b c d e f g h i j k l m n o p q r s t u v w x y z
参数的个数是: 26
当前进程的 PID 是: 25394
$4=d
$5=e
$6=f
$*=a b c d e f g h i j k l m n o p q r s t u v w x y z
$@=a b c d e f g h i j k l m n o p q r s t u v w x y z
$#=26
$$=25394
2.变量赋值方式
1.显式赋值(变量名=变量值)
#!/bin/bash
ip1=192.168.0.10
school="Xiaoming Xiaohong"
today1=`date +%F`
today2=$(date +%F)
echo $ip1
echo $school
echo $today1
echo $today2
运行结果:
[root@VM-1-12-centos data]# bash xianshi.sh
192.168.0.10
Xiaoming Xiaohong
2023-07-03
2023-07-03
2.read从键盘读入变量值
read 变量名
read -p "提示信息: " 变量名
read -t 5 -p "提示信息: " 变量名
read -n 2 变量名
//示例:
vim read1.sh
#!/bin/bash
back_dir1=/var/backup
read -p "请输入你的备份目录: " back_dir2
echo "系统默认的备份路径: " $back_dir1
echo "自定义的备份路径:" $back_dir2
vim ping2.sh
#!/bin/bash
read -p "Input IP: " ip
ping -c2 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "host $ip is ok"
else
echo "host $ip is fail"
fi
结果:
[root@VM-1-12-centos data]# bash read1.sh
请输入你的备份目录: /date
系统默认的备份路径: /var/backup
自定义的备份路径: /date
[root@VM-1-12-centos data]# bash ping2.sh
Input IP: 10.10.1.12
host 10.10.1.12 is ok
3.注意事项: 定义或引⽤变量时注意事项: " " 弱引⽤ ' ' 强引⽤
[root@VM-1-12-centos ~]# name=`hostname`
[root@VM-1-12-centos ~]# echo "${name} is good"
VM-1-12-centos is good
[root@VM-1-12-centos ~]# echo '${name} is good'
${name} is good
4.``命令替换等价于 $() 反引号中的 shell 命令会被先执⾏(在上个示例中我们已经使用``)
[root@VM-1-12-centos data]# touch `date +%F`_file1.txt
[root@VM-1-12-centos data]# touch $(date +%F)_file2.txt
[root@VM-1-12-centos data]# disk_free3="df -Ph |grep '/$' |awk '{print $4}'"
[root@VM-1-12-centos data]# disk_free4=$(df -Ph |grep '/$' |awk '{print $4}')
[root@VM-1-12-centos data]# disk_free5=`df -Ph |grep '/$' |awk '{print $4}'`
测试后的结果如下:
[root@VM-1-12-centos data]# echo $disk_free3
df -Ph |grep '/$' |awk '{print }'
[root@VM-1-12-centos data]# echo $disk_free4
44G
[root@VM-1-12-centos data]# echo $disk_free5
44G
3.变量数值运算
1.整数运算expr + - \* / %
expr 5 + 4
expr $num1 + $num2
2.整数运算$(()) + - * / %
echo $(($num1+$num2))
echo $((num1+num2))
echo $((4-5*4))
echo $(((6-5)*4))
echo $((2**5))
sum=$((1+4));echo $sum
3.整数运算$[] + - * / %
echo $[6+8]
echo $[5**2]
4.整数运算 let + - * / %
let sum=5+6;
echo $sum
5.小数运算bc + - * / %
echo "3*4" | bc
echo "5*8" |bc
echo "scale=3;8/6" |bc
awk 'BEGIN{print 1/2}'
awk 'BEGIN{print 7/8}'
echo "print 8.0/2" |python
4.变量删除替换
1.从前往后删除变量内容
[root@VM-1-12-centos data]# url=www.baidu.com
//获取变量值的长度
[root@VM-1-12-centos data]# echo ${#url}
13
//输出变量的长度
[root@VM-1-12-centos data]# echo ${url}
www.baidu.com
//从前往后,最短匹配
[root@VM-1-12-centos data]# echo ${url#*.}
baidu.com
//从前往后,最长匹配(贪婪模式)
[root@VM-1-12-centos data]# echo ${url##*.}
com
2.从后面往前删除变量内容
[root@VM-1-12-centos ~]# url=www.yangfboolg.com
[root@VM-1-12-centos ~]# echo ${url}
www.yangfboolg.com
//从后往前,最短匹配
[root@VM-1-12-centos ~]# echo ${url%.*}
www.yangfboolg
//从后往前,最长匹配 贪婪匹配
[root@VM-1-12-centos ~]# echo ${url%%.*}
www
[root@VM-1-12-centos ~]# url=www.yangfboolg.com
[root@VM-1-12-centos ~]# echo ${url#a.}
www.yangfboolg.com
[root@VM-1-12-centos ~]# echo ${url#*yangfboolg.}
com
[root@www ~]# echo ${HOSTNAME##.*}
www.yangfblog.com
[root@www ~]# echo ${HOSTNAME%.*}
www.yangfblog
[root@www ~]# echo ${HOSTNAME%%.*}
www
3.切片及索引
[root@www ~]# url=www.yangfboolg.com
[root@www ~]# echo ${url:0:5}
www.y
[root@www ~]# echo ${url:5:5}
angfb
[root@www ~]# echo ${url:6:5}
ngfbo
[root@www ~]# echo ${url:5}
angfboolg.com
4.变量内容替换
[root@www ~]# url=www.yangfboolg.com.cn
[root@www ~]# echo ${url/n/N}
www.yaNgfboolg.com.cn
//贪婪匹配
[root@www ~]# echo ${url//n/N}
www.yaNgfboolg.com.cN
5.变量替代
${变量名-新的变量值}
变量没有被赋值:会使用“新的变量值”替代
变量有被赋值(包括空值):不会被替代
//例1
[root@www ~]# unset url
[root@www ~]# echo $url
[root@www ~]# url=www.yangfboolg.com
[root@www ~]# echo $url
www.yangfboolg.com
[root@www ~]# echo ${url-www.xxxx.com}
www.yangfboolg.com
[root@www ~]# unset url
[root@www ~]# echo ${url-www.xxx.com}
www.xxx.com
//例2
[root@www ~]# url2=
[root@www ~]# echo ${url2-www.baidu.com}
6.变量的替代
${变量名:-新的变量值}
变量没有被赋值(包括空值):都会使用“新的变量值”替代
变量没有赋值:不会被替代
//例1
[root@www ~]# unset url
[root@www ~]# echo $url
[root@www ~]# url=www.yangfboolg.com
[root@www ~]# echo $url
www.yangfboolg.com
[root@www ~]# echo ${url:-www.xxxx.com}
www.yangfboolg.com
[root@www ~]# unset url
[root@www ~]# echo ${url:-www.xxxx.com}
www.xxxx.com
//例2
[root@www ~]# url2=
[root@www ~]# echo $url2
[root@www ~]# echo ${url2:-www.xxxx.com}
www.xxxx.com
5.自增变量
[root@www ~]# unset i
[root@www ~]# unset j
[root@www ~]# i=1
[root@www ~]# j=1
[root@www ~]# let x=i++
[root@www ~]# let y=++j
[root@www ~]# echo $i
2
[root@www ~]# echo $j
2
[root@www ~]# echo $x
1
[root@www ~]# echo $y
2
[root@www ~]# i=1
[root@www ~]# let i++
[root@www ~]# echo $i 2
2 2
实际案例:
[root@www ~]# cat i++.sh
#!/bin/bash
ip=223.6.6.6
i=1
while [ $i -le 5 ];do
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip is up ..."
fi
let i++
done
*如果有遗漏的点,欢迎大家提出意见