shell 变量
本章节可以掌握内容
变量的类型
变量的定义方式
变量的运算
变量“内容”的删除和替换
一.什么是shell变量
shell 变量? 用一个特定的字符串表示不固定的内容
二、变量的定义:
1.自定义变量
自定义变量:变量名=变量值 变量名必须以字母开头或下划线开头,区分大小写 例
:ip1=114.114.114.114
引用变量:$变量名或 ${变量名}
看着变量:echo $ 变量名 set(所有变量:包括自定义变量和环境变量)
取消变量:仅在当前shell中有效
2.环境变量
自定义环境变量: 方法一 export back_dir=/home/backup
方法二 export back_dir1 将自定义变量转换成环境变量
引用环境变量:$变量名称 或 ${ 变量名称}
查看环境变量:echo $变量名 env 例如env | grep back_dir2
取消环境变量:unset 变量名
变量作用范围:在当前shell和子shell有效
3.位置变量
$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
注意:位置变量大于9 需使用${n}表示
4.预定义变量
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$! 上一个后台进程的PID
$? 上一个命令的返回值0表示成功
三、变量的赋值方式:
1.显示赋值
变量名=变量值
实例:
ip1=1.1.1.1
school=“BeiJing”
todat1=`date +%F`
today2=$(date +%F)
2.read 从键盘读入变量值
read 变量名
read -p “提示信息: “变量名
read -t 5 -P “提示信息:” 变量名 //-t 时间
read -n 2 变量名 //-n 字符
实例:
#vim first.sh
vach_dir=/var/backup
read -p “请输入你的备份目录:” back_dir2
echo $back_dir1
echo $back_dir2
#sh first.sh-
#定义或引用变量时注意事项
“ ” 弱引用
‘ ’ 强引用
[root@131 ~]# school=bejijing
[root@131 ~]# echo "$school is good"
bejijing is good
[root@131 ~]# echo '$school is good'
$school is good
` ` 命令替换等价于 $( ) ,反引号中的shell命令会先被执行
touch `date +%F`_file1.txt
touch $(date +%F)_file2.txt
三、变量的运算
1.整数运算
[root@133 ~]# sum1=100
[root@133 ~]# sum2=200
方法一:expr
expr 1+2
expr $num1 + $num2 + - \* / %:余数
方法二 $(( ))
echo $(($num1+$num2)) + - \* / %:余数
echo $((sum1+sum2))
echo $(($sum1+$sum2))
echo $((2**3)) //2的三次方
echo $(((5+2)*3)) //先算括号中的
sum=$((1+2));echo $sum
方法三 $[ ]
echo $[5+2] + - \* / %:余数
echo $[5**2]
方法四 let
let sum=2+3;echo $sum
let i++ ;echo $i //增加变量值
案例:let i++
#!/usr/bin/bash
ip=114.114.114.114
ip1=192.168.154.133
i=1 //一次累加
done
while [ $i -le 5 ] //-le 大于等于5
do
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "${ip}成功"
else
echo "${ip}失败"
fi
let i++ #循环一次+1
done
2.小数运算
echo “2*4” | bc //bc linux系统中的计算器
echo “2^4” | bc //bc 中^表示次方
echo “scale=2;6/4” | bc
awk ‘BGGIN{print 1/2}’
echo “print 5.0/2” | python
**案例 :使用脚本计算出当前内存百分比:**
awk 使用
[root@133 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 50G 7.9G 43G 16% /
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 13M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sr0 iso9660 4.3G 4.3G 0 100% /var/ftp/centos
/dev/sdb1 ext4 99G 25G 69G 27% /kvm
/dev/mapper/centos-home xfs 46G 39M 46G 1% /home
/dev/sda1 xfs 1014M 157M 858M 16% /boot
tmpfs tmpfs 378M 4.0K 378M 1% /run/user/0
[root@133 ~]# df -Th | grep '^/dev/sr0' | awk '{print $3}' //grep ‘^’ 表示第一列 | awk ‘{print $2}’ 表示第一列第2个数值
4.3G
vim disk.sh
**#!/usr/bin/bash
mem_used=$(free -m | grep '^Mem' | awk '{print $3}')
mem_total=$(free -m | grep '^Mem' | awk '{print $2}')
mem_aa=$((mem_used*100/mem_total))
echo -e "当前内存使用百分比是: \e[1;32m$mem_aa%\e[0m"**
[root@133 ~]#./disk.sh #执行脚本
四、变量“内容”的删除和替换
=====“内容的”删除=========**
[root@131 ~]# url=www.sina.com.cn
[root@131 ~]# echo ${#url} //获取变量值的长度
15
[root@131 ~]# echo ${url#*.} //从前往后最短匹配
sina.com.cn
[root@131 ~]# echo ${url##*.} //从前往后最长匹配
cn
[root@131 ~]# echo ${url} //标准查看
www.sina.com.cn
[root@131 ~]# echo ${rul%%.*} //从后往前最长匹配
www
[root@131 ~]# echo ${url%.*} //从后往前最短匹配
www.sina.com
索引切片
[root@131 ~]# www.sina.com.cn^C 根据数字来选取字符
[root@131 ~]# 0123456789^
[root@131 ~]# echo ${url:5:5}
ina.c
[root@131 ~]# echo ${url:5}
ina.com.cn
[root@131 ~]# echo ${url:0:5}
www.s
**=======“替换”========**
[root@131 ~]# echo "$rul"
www.sina.com.cn
[root@131 ~]# echo ${url/sina/baidu} //将sina修改为baidu
www.baidu.com.cn
[root@131 ~]# echo ${url/n/N}
www.siNa.com.cn
[root@131 ~]# echo ${url//n/N}
www.siNa.com.cN
**========变量的替代=========**
[root@131 ~]# var1=123
[root@131 ~]# echo ${var1-aaa}
123
[root@131 ~]# echo ${var2-aaaa}
aaaa
[root@131 ~]# var3=
[root@131 ~]# echo "$var3-aaa"
-aaa
[root@131 ~]# ${var3-aaaa}
**${变量名-新的变量值}
变量没有被赋值:会使用“新的变量值”替代
变量有被赋值(包括空置):将不会替代**
[root@131 ~]# unset var1
[root@131 ~]# unset var2
[root@131 ~]# unset var3
[root@131 ~]# var2=
[root@131 ~]# var3=1111
[root@131 ~]# echo ${var1:-aaaaa}
aaaaa
[root@131 ~]# echo ${var2:-aaaaaaa}
aaaaaaa
[root@131 ~]# echo ${var3:-aaaaaaa}
1111
${变量名-新的变量值}
变量没有被赋值(包括空置):都会使用“新的变量值”
变量又被赋值:不会被代替
**i++,++i区别 (了解)**
[root@131 ~]# i=2
[root@131 ~]# let i++
[root@131 ~]# echo $i
3
[root@131 ~]# j=2
[root@131 ~]# let ++j
[root@131 ~]# echo $j
3
[root@131 ~]# unset i
[root@131 ~]# unset j
[root@131 ~]# j=1
[root@131 ~]# i=1
[root@131 ~]# let x=i++ //先赋值,后运算
[root@131 ~]# echo $x
1
[root@131 ~]# let y=++j //先运算,后赋值
[root@131 ~]# echo $i
2
[root@131 ~]# echo $j
2
[root@131 ~]# echo $x
1
[root@131 ~]# echo $y
2