一、变量的类型
1、自定义变量
定义变量: 变量名=变量值 变量名必须以字母或下划线开头,区分大小写 ip1=192.168.2.115
引用变量: $变量名 或 ${变量名}
查看变量: echo $变量名 set(所有变量:包括自定义变量和环境变量)
取消变量: unset 变量名
作用范围: 仅在当前shell中有效
2、环境变量
定义环境变量: 方法一 export back_dir2=/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} ${11}
4、预定义变量
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$! 上一个后台进程的PID
$? 上一个命令的返回值 0表示成功
示例1:
[root@lichu ~]# vim test.sh
echo "第2个位置参数是$2"
echo "第1个位置参数是$1"
echo "第4个位置参数是$4"
echo "所有参数是: $*"
echo "所有参数是: $@"
echo "参数的个数是: $#"
echo "当前进程的PID是: $$"
echo '$1='$1
echo '$2='$2
echo '$3='$3
echo '$*='$*
echo '$@='$@
echo '$#='$#
echo '$$='$$
[root@lichu ~]# chmod +x test.sh
[root@lichu ~]# ./test.sh li lichu alice jack tom 100
第2个位置参数是lichu
第1个位置参数是li
第4个位置参数是jack
所有参数是: li lichu alice jack tom 100
所有参数是: li lichu alice jack tom 100
参数的个数是: 6
当前进程的PID是: 76416
$1=li
$2=lichu
$3=alice
$*=li lichu alice jack tom 100
$@=li lichu alice jack tom 100
$#=6
$$=76416
示例2:
[root@lichu ~]# vim ping.sh
#!/bin/bash
ping -c2 $1 &>/dev/null
if [ $? = 0 ];then
echo "host $1 is ok"
else
echo "host $1 is fail"
fi
[root@lichu ~]# chmod a+x ping.sh
[root@lichu ~]# ./ping.sh www.baidu.com
[root@lichu ~]# ./ping.sh 192.168.92.100
二、变量的赋值方式
1、显式赋值
变量名=变量值
ip1=192.168.1.251
school="BeiJing qfedu"
today1=`date +%F`
today2=$(date +%F)
2、read 从键盘读入变量值
语法:
read 变量名
read -p “提示信息: ” 变量名
read -t 5 -p “提示信息: ” 变量名
read -n 2 变量名
示例3:
[root@lichu ~]# vim first.sh
back_dir1=/var/backup
read -p "请输入你的备份目录: " back_dir2
echo $back_dir1
echo $back_dir2
# chmod +x first.sh
# ./first.sh
示例4:
[root@lichu ~]# vim ping2.sh
#!/bin/bash
read -p "Input IP: " ip
ping -c2 $ip &>/dev/null
if [ $? = 0 ];then
echo "host $ip is ok"
else
echo "host $ip is fail"
fi
[root@lichu ~]# chmod a+x ping2.sh
[root@lichu ~]# ./ping.sh
定义或引用变量时注意事项
" " 弱引用
' ' 强引用
[root@lichu ~]# school=1000phone
[root@lichu ~]# echo "${school} is good"
1000phone is good
[root@lichu ~]# echo '${school} is good'
${school} is good
` ` 命令替换 等价于 $() 反引号中的shell命令会被先执行
[root@lichu ~]# touch `date +%F`_file1.txt
[root@lichu ~]# touch $(date +%F)_file2.txt
[root@lichu ~]# disk_free3="df -Ph |grep '/$' |awk '{print $4}'" # 错误
[root@lichu ~]# disk_free4=$(df -Ph |grep '/$' |awk '{print $4}')
[root@lichu ~]# disk_free5=`df -Ph |grep '/$' |awk '{print $4}'`
三、变量的运算
1、整数运算
[root@lichu ~]# num1=2
[root@lichu ~]# num2=5
方法一:expr
expr 1 + 2
expr $num1 + $num2 + - \* / %
方法二:$(())
echo $(($num1+$num2)) + - * / %
echo $((num1+num2))
echo $((5-3*2))
echo $(((5-3)*2))
echo $((2**3))
sum=$((1+2)); echo $sum
方法三:$[]
echo $[5+2] + - * / %
echo $[5**2]
方法四:let
let sum=2+3; echo $sum
let i++; echo $i
2、小数运算
方法一:bc
echo "2*4" |bc
echo "2^4" |bc
echo "scale=2;6/4" |bc
方法二:awk
awk 'BEGIN{print 1/2}'
方法三:python
echo "print 5.0/2" |python
四、变量”内容”的删除和替换(扩展了解)
1、变量”内容”的删除
[root@lichu ~]# url=www.sina.com.cn
[root@lichu ~]# echo ${#url} # 获取变量值的长度
15
[root@lichu ~]# echo ${url} # 标准查看
www.sina.com.cn
[root@lichu ~]# echo ${url#*.} # 从前往后,最短匹配(*任意字符,匹配到第一个.)
sina.com.cn
[root@lichu ~]# echo ${url##*.} # 从前往后,最长匹配 贪婪匹配
cn
[root@lichu ~]# url=www.sina.com.cn
[root@lichu ~]# echo ${url}
www.sina.com.cn
[root@lichu ~]# echo ${url%.*} # 从后往前,最短匹配
www.sina.com
[root@lichu ~]# echo ${url%%.*} # 从后往前,最长匹配 贪婪匹配
www
[root@lichu ~]# url=www.sina.com.cn
[root@lichu ~]# echo ${url#a.}
www.sina.com.cn
[root@lichu ~]# echo ${url#*sina.}
com.cn
[root@lichu ~]# hostname lichu.1000phone.com # 设置临时主机名
退出shell,重新连接
[root@lichu ~]# echo $HOSTNAME
lichu.1000phone.com
[root@lichu ~]# echo ${HOSTNAME%%.*}
lichu
索引及切片
[root@lichu ~]# url=www.sina.com.cn
[root@lichu ~]# echo ${url:0:5} # 从第一个(0)字符开始,取5个字符
[root@lichu ~]# echo ${url:5:5}
[root@lichu ~]# echo ${url:5}
2、变量”内容”的替换
[root@lichu ~]# url=www.sina.com.cn
[root@lichu ~]# echo ${url/sina/baidu}
www.baidu.com.cn
[root@lichu ~]# url=www.sina.com.cn
[root@lichu ~]# echo ${url/n/N} # /替换第一个
www.siNa.com.cn
[root@lichu ~]# echo ${url//n/N} # //替换全部 贪婪匹配
www.siNa.com.cN
4、变量的替代
#准备场景
[root@lichu ~]# unset var1
[root@lichu ~]# unset var2
[root@lichu ~]# unset var3
[root@lichu ~]# # var1没有定义
[root@lichu ~]# var2= # var2有定义,但为空值
[root@lichu ~]# var3=111 # var3有定义,有值
#第一种替代 ${变量名-新的变量值}
[root@lichu ~]# echo ${var1-aaaa}
aaaa
[root@lichu ~]# echo ${var2-aaaa}
[root@lichu ~]# echo ${var3-aaaa}
111
#变量没有被赋值:会使用“新的变量值“ 替代
#变量有被赋值(包括空值): 不会被替代
#第二种替代 ${变量名:-新的变量值}
[root@lichu ~]# echo ${var1:-aaaa}
aaaa
[root@lichu ~]# echo ${var2:-aaaa}
aaaa
[root@lichu ~]# echo ${var3:-aaaa}
111
#变量没有被赋值(包括空值):都会使用“新的变量值“ 替代
#变量有被赋值: 不会被替代
结论:${变量名-新的变量值} 和 ${变量名:-新的变量值} 仅对空值变量有影响 var2
示例5:
[root@lichu scripts]# vim var1.sh
#!/bin/bash
read -p "输入端口[默认为80]: " port
echo "你输入的端口为: $port"
[root@lichu scripts]# chmod +x var1.sh
[root@lichu scripts]# ./var1.sh
输入端口[默认为80]: # 直接回车,没有输入
你输入的端口为:
[root@lichu scripts]# vim var2.sh
#!/bin/bash
read -p "输入端口[默认为80]: " port
echo "你输入的端口为: ${port:-80}"
[root@lichu scripts]# ./var2.sh
输入端口[默认为80]: 21
你输入的端口为: 21
[root@lichu scripts]# ./var2.sh
输入端口[默认为80]:
你输入的端口为: 80
五、i++ 和 ++i (扩展了解)
1、对表达式的值的影响
[root@lichu ~]# unset i
[root@lichu ~]# unset j
[root@lichu ~]# i=1
[root@lichu ~]# j=1
[root@lichu ~]# let x=i++ # 先赋值,再运算
[root@lichu ~]# let y=++j # 先运算,再赋值
[root@lichu ~]# echo $i
2
[root@lichu ~]# echo $j
2
[root@lichu ~]# echo $x
1
[root@lichu ~]# echo $y
2