day02-shell变量 1、自定义变量 [root@db01 ~]# echo $(ifconfig bond0 | grep inet) 定义变量 变量名=xxx 不能数字命名,不能-。 调用变量 $变量名 ${变量名} 查看变量 echo $变量名 取消变量 unset 变量名 变量作用范围 在当前shell和子shell中生效。 [root@db01 ~]# vim ping.sh #!/bin/bash IP=10.0.0.11 ping -c 3 $IP &>> /dev/null && echo "ip $IP ping successful." || echo "ip $IP ping fail." [root@db01 ~]# sh ping.sh ip 10.0.0.11 ping successful. [root@db01 ~]# sh -xv ping.sh #!/bin/bash IP=10.0.0.11 + IP=10.0.0.11 ping -c 3 $IP &>> /dev/null && echo "ip $IP ping successful." || echo "ip $IP ping fail." + ping -c 3 10.0.0.11 + echo 'ip 10.0.0.11 ping successful.' ip 10.0.0.11 ping successful. 2、系统环境变量 范围作用于全局 [root@db01 ~]# echo $HOME /root [root@db01 ~]# echo $SHELL /bin/bash [root@db01 ~]# echo $PS1 [[033[1;32m]u[033[0m]@[033[1;35m]h[033[0m] [033[1;36m]w[033[0m]]$ [root@db01 ~]# echo $LANG en_US.UTF-8 [root@db01 ~]# vim 1.sh #!/bin/bash source ./ping.sh echo $IP [root@db01 ~]# sh 1.sh ip 10.0.0.11 ping successful. 10.0.0.11 [root@db01 ~]# vim ping.sh #!/bin/bash IP=10.0.0.11 ping -c 3 $IP &>> /dev/null if [ $? -eq 0 ]; then echo "ip $IP ping successful." else echo "ip $IP ping fail." fi [root@db01 ~]# sh ping.sh ip 10.0.0.11 ping successful. 3、位置参数变量 脚本参传参 $1 $2 $3 ... [root@db01 ~]# vim ping.sh #!/bin/bash ping -c 3 $1 &>> /dev/null if [ $? -eq 0 ]; then echo "ip $1 ping successful." else echo "ip $1 ping fail." fi [root@db01 ~]# sh ping.sh 10.0.0.11 ip 10.0.0.11 ping successful. [root@db01 ~]# sh ping.sh 10.0.0.12 ip 10.0.0.12 ping fail. [root@db01 ~]# vim ping.sh #!/bin/bash read -p "please input ping network ip: " IP ping -c 3 $IP &>> /dev/null if [ $? -eq 0 ]; then echo "ip $IP ping successful." else echo "ip $IP ping fail." fi [root@db01 ~]# sh ping.sh please input ping network ip: 10.0.0.11 ip 10.0.0.11 ping successful. [root@db01 ~]# sh ping.sh please input ping network ip: 10.0.0.12 ip 10.0.0.12 ping fail. 4、预定义变量 $0 脚本名 $* 所有的参数 $@ 所有的参数 $# 参数的个数 $$ 当前进程的pid $! 上一个后台进程的pid $? 上一个命令的返回值,0 表示成功。 例如: [root@db01 ~]# vim 1.sh #!/bin/bash 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 '$$'=$$ echo '$0'=$0 [root@db01 ~]# sh 1.sh 1 2 3 4 5 6 7 8 9 第 3 个位置参数是: 3 第 2 个位置参数是: 2 第 1 个位置参数是: 1 所有的参数是: 1 2 3 4 5 6 7 8 9 所有的参数是: 1 2 3 4 5 6 7 8 9 参数的个数是: 9 当前进程的pid是: 1855 $4=4 $5=5 $6=6 $*=1 2 3 4 5 6 7 8 9 $@=1 2 3 4 5 6 7 8 9 $#=9 $$=1855 $0=1.sh [root@db01 ~]# sh /root/1.sh 第 3 个位置参数是: 第 2 个位置参数是: 第 1 个位置参数是: 所有的参数是: 所有的参数是: 参数的个数是: 0 当前进程的pid是: 1857 $4= $5= $6= $*= $@= $#=0 $$=1857 $0=/root/1.sh [root@db01 ~]# basename /root/1.sh 1.sh 5、变量赋值的方式 1、显示赋值:变量名=变量值 ip=10.0.0.11 name="zhouwanchun" today1=`date +%F` today2=$(date +%F) 2、read 从键盘读入变量值 read 变量名 read -p "提示信息: " 变量名 read -t 5 -p "提示信息: " 变量名 read -n 2 变量名 [root@db01 ~]# vim backup.sh #!/bin/bash backup_dir1=/backup/mysql/mysql3306 read -p "请输入备份目录: " backup_dir2 echo $backup_dir1 echo $backup_dir2 [root@db01 ~]# sh backup.sh 请输入备份目录: /backup/mysql/mysql3307 /backup/mysql/mysql3306 /backup/mysql/mysql3307 注意事项:定义和引用变量时,""弱引用,''强引用 "" 会解析变量内容 '' 不解析,所见即所得 [root@db01 ~]# echo "!@#$" -bash: !@#$: event not found [root@db01 ~]# echo '!@#$' !@#$ $() `` shell会先被执行。所以命令要用$()或``引起来。 [root@db01 ~]# echo hostname hostname [root@db01 ~]# echo $(hostname) db01 6、变量数值运算 1、整数运算 expr + - * / % [root@db01 ~]# a=10 [root@db01 ~]# b=2 [root@db01 ~]# expr $a + $b 12 [root@db01 ~]# expr $a - $b 8 [root@db01 ~]# expr $a * $b 20 [root@db01 ~]# expr $a / $b 5 [root@db01 ~]# expr $a % $b 0 [root@db01 ~]# echo $((10+2)) 12 [root@db01 ~]# echo $((10-2)) 8 [root@db01 ~]# echo $((10*2)) 20 [root@db01 ~]# echo $((10/2)) 5 [root@db01 ~]# echo $((10%2)) 0 [root@db01 ~]# echo $[10+2] 12 [root@db01 ~]# echo $[10-2] 8 [root@db01 ~]# echo $[10*2] 20 [root@db01 ~]# echo $[10/2] 5 [root@db01 ~]# echo $[10%2] 0 [root@db01 ~]# let sum=1+2 [root@db01 ~]# echo $sum 3 2、小数运算 bc + - * / % [root@db01 ~]# echo 10/3 |bc 3 [root@db01 ~]# echo "scale=2;10/3" |bc 3.33 [root@db01 ~]# echo "print(10/3)" |python3 3.3333333333333335 7、变量内容替换 [root@db01 ~]# url=www.mysql.com 切片 # 代表从前往后切,# 代表匹配第一个,## 贪婪匹配,* 所有内容 [root@db01 ~]# echo ${url} www.mysql.com [root@db01 ~]# echo ${url#*.} mysql.com [root@db01 ~]# echo ${url##*.} com [root@db01 ~]# echo ${#url} #长度 13 切片 % 代表从后往前切 [root@db01 ~]# echo ${url%.*} www.mysql [root@db01 ~]# echo ${url%%.*} www 索引切片 [root@db01 ~]# echo ${url:0:3} www [root@db01 ~]# echo ${url:4} mysql.com [root@db01 ~]# echo ${url:4:8} mysql.co [root@db01 ~]# echo ${url:4:9} mysql.com 变量内容替换 [root@db01 ~]# echo ${url/mysql/oracle} www.oracle.com [root@db01 ~]# echo ${url/w/W} Www.mysql.com [root@db01 ~]# echo ${url//w/W} WWW.mysql.com 8、变量替代 url默认值是www.oracle.com unset 取消变量 [root@db01 ~]# url=www.mysql.com [root@db01 ~]# echo ${url} www.mysql.com 变量无值会替代 [root@db01 ~]# echo ${url-www.oracle.com} www.mysql.com [root@db01 ~]# unset url [root@db01 ~]# echo ${url-www.oracle.com} www.oracle.com 变量有值不会被替代 [root@db01 ~]# url=www.mysql.com [root@db01 ~]# echo ${url:-www.baidu.com} www.mysql.com [root@db01 ~]# echo url url [root@db01 ~]# echo $url [root@db01 ~]# echo ${url:-www.baidu.com} www.baidu.com 9、变量自增 i++,i-- 先赋值,再运算 ++i,--i 先运算,再赋值 [root@db01 ~]# vim i++.sh #!/bin/bash ip=10.0.0.11 i=1 while [ $i -le 5 ];do ping -c 1 $ip &>> /dev/null if [ $i -eq 5 ];then echo "$ip is up ..." fi let i++ done [root@db01 ~]# sh i++.sh 10.0.0.11 is up ...