- 变量:用一个固定的字符串去表示不固定的内容;
自定义普通变量
- 定义变量:
变量名=value
,可使用驼峰命名法,但不允许使用数字命名,不能使用横杠命名; - 引用变量:
$变量名
或者${变量名}
- 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界;
- 创建一个脚本文件
ping.sh
,文件内容如下:
#!/bin/bash
NetWork_IP=192.169.63.177
ping -C1 $NetWork_IP &>/dev/null && echo "ip $NetWork_IP ok" || echo "ip $NetWork_IP error"
-
#!/bin/bash
:指明脚本执行的解释器; -
NetWork_IP=192.169.63.177
:自定义普通变量NetWork_IP
并初始化; -
ping -C1 $NetWork_IP &>/dev/null && echo "ip $NetWork_IP ok" || echo "ip $NetWork_IP error"
:ping指定的网址ping 192.169.63.177
,如果ping成功就打印ip $NetWork_IP ok
,如果ping失败就打印ip $NetWork_IP error
- 然后执行脚本文件
sh ping.sh
,终端输出如下:
- 查看变量:
echo $变量名
或者set|grep $变量名
- 取消变量:
unset 变量名
image.png - 终端定义一个变量k且赋值为100;
-
echo $k
:查的变量k的值为100; -
set|grep $k
:过滤查询关于k的所有结果,如上所示; -
unset k
取消变量k,再次查询变量k时,发现其值已经不存在了;
系统环境变量
- 系统的环境变量:就是系统预先给我们定义的变量,其作用域是全局的,脚本文件是直接可以调用的,常见的系统环境变量有如下:
-
HOME
:用户目录; -
PATH
:命令所示路径,以冒号为分隔符; -
SHELL
:当前shell类型; -
USER
:当前用户名; -
PWD
:当前路径; -
TERM
:当前终端类型; -
HOSTNAME
:当前主机名;
image.png
-
- 创建一个脚本文件
ping3.sh
,编辑内容如下:
#!/bin/bash
# 在脚本文件中直接访问系统的环境变量PATH
echo "${PATH}"
-
执行
image.pngsh ping.3.sh
,结果如下:
-
下面演示一种场景,定义两个脚本文件分别为
ping.sh
与ping2.sh
,脚本内容如下: -
ping.sh
脚本
#!/bin/bash
#定义了一个普通变量NetWork_IP
NetWork_IP=192.169.63.177
ping -C1 $NetWork_IP &>/dev/null && echo "ip $NetWork_IP ok" || echo "ip $NetWork_IP error"
-
ping2.sh
脚本
#!/bin/bash
#打印系统环境变量HOME
echo $HOME
#打印ping.sh脚本中定义的普通变量NetWork_IP
echo "test $NetWork_IP"
- 执行脚本
ping2.sh
,结果如下:
image.png - 看到可以打印出系统环境变量
HOME
,没有打印出ping.sh
中的普通变量NetWork_IP
,也就是在ping2.sh
中不能直接访问ping.sh
中的普通变量NetWork_IP
- 在
ping2.sh
中加入source ./ping.sh
可实现在ping2.sh
中访问ping.sh
中的普通变量NetWork_IP
,修改后的ping2.sh
内容如下:
#!/bin/bash
source ./ping.sh
#打印系统环境变量HOME
echo $HOME
#打印ping.sh脚本中定义的普通变量NetWork_IP
echo "test $NetWork_IP"
- 执行
ping2.sh
,结果如下:
image.png -
source ./ping.sh
相当于将ping.sh
中内容,拷贝到ping2.sh
中,通过指令sh -vx ping2.sh
可查看ping2.sh
脚本的执行过程,如下所示:
image.png
自定义环境变量
- 定义临时系统变量:
export 变量名=value
- 引用临时系统变量:
$变量名
或${变量名}
- 查看临时系统变量:
echo $变量名
或env|grep 变量名
- 取消临时系统变量:
unset 变量名
- 临时系统变量的作用范围:在
当前shell
和子shell
中有效; - 定一个临时环境变量
IPHONE
,如下所示:
image.png - 在
ping2.sh
中引用临时系统变量IPHONE
,如下所示:
#!/bin/bash
source ./ping.sh
#打印系统环境变量HOME
echo $HOME
#打印ping.sh脚本中定义的普通变量NetWork_IP
echo "test $NetWork_IP"
#引用临时环境变量IPHONE
echo $IPHONE
-
然后执行
image.pngping2.sh
,结果如下:
-
若定义一个普通变量
image.pngAndroid
,如下所示:
-
在
ping2.sh
中引用普通变量Android
,如下所示:
#!/bin/bash
source ./ping.sh
#打印系统环境变量HOME
echo $HOME
#打印ping.sh脚本中定义的普通变量NetWork_IP
echo "test $NetWork_IP"
#引用临时环境变量IPHONE
echo $IPHONE
#引用普通变量Android
echo $Android
-
执行
image.pngping2.sh
,结果如下:
-
普通变量
Android
没有打印出来,这里就能看出普通变量
与系统变量
之间的区别了; -
此外选中终端,按
image.pngCommand + T
组合键,会出现一个新的终端窗口,在新的终端窗口也执行sh ping2.sh
,会发现不能访问定义的系统环境变量IPHONE
,如下所示:
-
表明
定义的临时系统环境变量
是存在作用范围的,只会在当前shell终端中生效; -
将自定义的环境变量写到系统配置文件中 -> 使之永久生效
-
终端执行
image.pngvim /etc/profile
,进入如下所示:
位置参数变量
- 位置参数变量主要应用于
脚本参数传参
:$1,$2,$3,$4,$5,$6,$7,$8,$9,${10}
- 执行脚本文件时,后面最多可以输入10个参数;
- 创建一个脚本文件
ping6.sh
,脚本内容如下:
#!/bin/bash
echo $1
echo $2
echo $3
echo $4
ping -c1 $1 &>/dev/null
if [ $? -eq 0 ]; then
echo -e "\033[32m IP $1 is OK! \033[0m"
else
echo -e "\033[31m IP $1 is Error! \033[0m"
fi
- 执行脚本
sh ping6.sh li yan yan shen xian
,结果如下所示:
image.png - 看出执行脚本后面跟的
li yan yan shen xian
分别对应$1,$2,$3,$4,$5
这五个参数,$5
这个参数在脚本中没有使用所以无效; - 脚本参数传参时,每个参数以
空格
间隔开; - 创建一个脚本文件
ping7.sh
,脚本内容如下:
#!/bin/bash
read -p "please is Ping Network IP: " ip
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ]; then
echo -e "\033[32m IP $ip is OK! \033[0m"
else
echo -e "\033[31m IP $ip is Error! \033[0m"
fi
- 执行脚本
sh ping7.sh
,如下所示:
image.png -
read -p "please is Ping Network IP: " ip
:含义为让用户手动输入IP地址,用变量ip来接收用户输入的IP内容;
预先定义变量
-
$0
:表示脚本文件名; -
$*
:表示执行脚本 传入的所有参数; -
$@
:表示执行脚本 传入的所有参数; -
$#
:表示执行脚本 传入的所有参数的个数; -
$$
:表示执行脚本 当前进程的PID; -
$!
:上一个后台进程的PID; -
$?
:上一个命令的返回值,0
表示成功; -
创建脚本文件
yxbl.sh
,脚本内容如下:
#!/bin/bash
echo "脚本名称是:$0"
echo "第三个位置参数是:$3"
echo "第四个位置参数是:$4"
echo "第五个位置参数是:$5"
echo "所有参数:$*"
echo "所有参数:$@"
echo "所有参数的个数:$#"
echo "当前进程的 PID 是:$$"
- 执行脚本
sh yxbl.sh 1 2 3 4 5 6 7 8 9 10
,执行结果如下:
image.png - 脚本
sh yxbl.sh
的路径为:/Users/liyanyan33/soft/scripts/day01/sh yxbl.sh
,若到/Users/liyanyan33/soft
路径下执行脚本sh scripts/day01/yxbl.sh 1 2 3 4 5 6 7 8 9 10
,执行结果如下:
image.png - 看到脚本名称
$0
会将执行路径也打印出来,若实现不论在什么路径下执行目标脚本,只打印脚本名称,脚本内容做如下修改:
#!/bin/bash
echo "脚本名称是:$(basename $0)"
echo "第三个位置参数是:$3"
echo "第四个位置参数是:$4"
echo "第五个位置参数是:$5"
echo "所有参数:$*"
echo "所有参数:$@"
echo "所有参数的个数:$#"
echo "当前进程的 PID 是:$$"
- 执行脚本
sh scripts/day01/yxbl.sh 1 2 3 4 5 6 7 8 9 10
,结果如下:
image.png
变量赋值方式
第一种:显示赋值
- 创建脚本
test1.sh
,脚本内容如下:
#!/bin/bash
IP=192.168.55.11
school="QingHuaDaXue"
today_time1=`date +%F`
today_time2=$(date +%F)
echo $IP
echo $school
echo $today_time1
echo $today_time2
- 执行脚本
sh test1.sh
,结果如下:
image.png -
today_time1
中的中引号是反引号``
而不是单引号''
,通常使用today_time2=$(date +%F)
这种方式赋值;
第二种:read 从键盘读入变量值
-
read -p "提示信息: " 变量名
:表示提示输入信息,输入的内容赋值给右侧的变量; -
read -t 5 -p "提示信息: " 变量名
:表示提示输入信息,输入的内容赋值给右侧的变量,若用户在5秒内没有输入,就会自动退出; -
创建脚本文件
test2.sh
,脚本内容如下:
#!/bin/bash
back_dir1=/var/backup
read -p "请输入你的备份目录:" back_dir2
echo $back_dir1
echo $back_dir2
-
执行脚本
image.pngsh test2.sh
,结果如下:
-
创建脚本文件
test3.sh
,脚本内容如下:
#!/bin/bash
read -p "输入IP:" ip
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ]; then
echo "host $ip is OK!!!"
else
echo "host $ip is Err!!!"
fi
-
执行脚本
image.pngsh test3.sh
,结果如下:
-
创建脚本文件
test5.sh
,脚本内容如下:
#!/bin/bash
read -t 5 -p "Please name: " name
echo "Use Name: $name"
-
read -t 5 -p "Please name: " name
:表示提示用户输入姓名,并赋值给变量name,若用户在5秒内没有输入,就会自动退出; - 注意事项1⚠️:定义或引用变量时使用
单引号
与双引号
的区别 ,终端直接输入定义变量,如下所示:
image.png - 使用
双引号会解析出变量的值
,而使用单引号不会解析变量的值,保持原样
,在引用特殊字符的时候应使用单引号
,使用双引号会出现解析报错,如下所示:
- 注意事项2⚠️:
反引号
等价于$()
; -
touch $(date +%F)_file2.txt
与touch
date +%F_file1.txt
等价 `以日期时间创建文件;
总结:
- 双引号:会解析变量;
- 单引号:不会解析变量,输入等于输出;
- 反引号:是用来解析shell命令的 其与
$()
等价;
变量的数值运算
-
整数运算方式一:
image.pngexpr + - \* / %
,注意乘法要加上反义字符\
,下面在终端中直接演示,如下所示:
-
整数运算方式二:
image.png$((+ - * / %))
,注意这里乘法不需要加反义字符\
,下面在终端中演示,如下所示:
-
整数运算方式三:
image.png$[+ - * / %]
,终端演示如下:
-
整数运算方式四:
image.pnglet xx= + - * / %
再echo $xx
-
小数运算:
bc
-
echo "scale=2;6/4" |bc
:输出结果为1.50
,其中scale=2表示保留两位小数;
变量替代
-
image.png${变量名-新值}
:表示变量的默认值为新值,即当变量有值时,取自己的值,当变量为空值时,取默认值,如下所示:
-
image.png${变量名-新值}
:不能预断变量为空,只有设置unset
才判断变量为空,取得默认值;
-
image.png${变量名:-新值}
:表示变量的默认值为新值,即当变量有值时,取自己的值,当变量为空值时,取默认值,如下所示:
-
image.png${变量名:-新值}
:能预断变量为空,则取得默认值,如下所示:
-
所以看出
${变量名-新值}
与${变量名:-新值}
之间最大的区别;
变量的自增
- 创建脚本
test6.sh
,内容如下:
#!/bin/bash
ip=192.168.56.11
i=1
while [ $i -le 5 ]; do
ping -c1 $ip &/dev/null
if [ $? -eq 0 ]; then
echo "$ip is up ..."
fi
let i++
done
- while循环,i <= 5 执行 循环体;
- let i++:i自增
网友评论