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 ...