一 变量介绍
什么是变量?
量指的是记录事物的状态
变指的是事物的状态是可以发生变化的
变量本质就是一种数据存取的机制,变量的数据都是存放于内存中的
为何要有变量?
程序运行的本质就是一系列状态的变化,
程序=数据+功能,
程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能够反映或者说是保存下来程序执行时状态以及状态的变化。
# 比如:
英雄的等级为1,打怪升级(变)为10
僵尸的存活状态True,被植物打死了,于是变为False
人的名字为egon,也可以修改为Egon
二 变量的使用
2.1 先定义、后引用
先定义
# 1、语法:变量名=值
# 2、注意:等号左右两边不能有空格!!!
# 3、例如:
[root@localhost shell]# name="dan"
后引用
[root@localhost shell]# ip="192.168.11.10"
[root@localhost shell]# echo $ip
192.168.11.10
注意:如果是打印百分比,建议使用${变量名}%
[root@localhost shell]# percent=33
[root@localhost shell]# echo ${percent}%
33%
2.2 删除变量
[root@localhost shell]# x=111
[root@localhost shell]# unset x
[root@localhost shell]# echo $x
三 变量的三大组成部分
基于上一小节我们得知,定义一个变量由三大部分组成
-
1、变量名:用来访问到变量值的
-
2、赋值符号:将变量值的内存地址绑定给变量名
-
3、变量值:即我们存的数据
3.1 变量名的命名规范
定义变量把数据存到内存中不是目的,目的是以后要取出来用,而变量名就是用来取变量值的,而变量的名字直接表明了所存值的意义,可见变量名的命名非常重要
# 变量名的命令应该见名知意,同时遵循如下规则
以字母或下划线开头,剩下的部分可以是:字母、数字、下划线,最好遵循下述规范:
1.以字母开头
2.使用中划线或者下划线做单词的连接
3.同类型的用数字区分
4.对于文件名的命名最好在末尾加上拓展名
例如: sql_bak.tar.gz,log_bak.tar.bz2
5、不要带有空格、?、*等特殊字符
6、不能使用bash中的关键字,例如if,for,while,do等
7、不要和系统环境变量冲突
3.2 变量值的三种来源
(1)直接赋值
# 1. 显式赋值:变量名=变量值
示例:
ip1=192.168.11.200
hoby="play"
today1=`date +%F`
today2=$(date +%F)
# 2、应用示例
[root@localhost ~]# url="www.baidu.com"
[root@localhost ~]# echo $url
www.baidu.com
[root@localhost ~]# url="www.sina.com.cn"
[root@localhost ~]# echo $url
www.sina.com.cn
(2)从位置参数获取变量值
从调用脚本时传入的位置参数获取变量值:./b.sh a1 a2 a3
需要用到$n获取第n个位置参数值,超过10需要用${n},如下
$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
# 示例
[root@dan ~]# cat b.sh
#!/usr/bin/env bash
echo ${0}
echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
echo $7
echo $8
echo $9
echo ${10}
echo ${11}
echo ${12}
# 运行
[root@dan ~]# chmod +x b.sh
[root@dan ~]# ./b.sh a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15
./b.sh
a1
a2
a3
a4
a5
a6
a7
a8
a9
a10
a11
a12
# 企业使用:可以实现脚本的不同功能(服务程序管理脚本-启动功能 关闭功能 重启功能)
server.sh start|stop|restart
(3)与用户交互获取值
何为交互,即输入、输出
# 一:read接收用户的输入,即从键盘读入变量值
read 变量名
read -p "提示信息: " 变量名
read -t 5 -p "提示信息: " 变量名 # -t指定秒数
read -n 2 变量名 # -n读取的字符个数
=======》应用示例:vim first.sh
back_dir1=/var/backup
read -p "请输入你的备份目录: " back_dir2
echo $back_dir1
echo $back_dir2
企业使用:可以根据需求调整变量值,可以便于新员工快速掌握企业脚本使用
# 二:输出
# 2.1 echo命令,详解情况:https://www.cnblogs.com/linhaifeng/articles/13976349.html
[root@dan ~~]# name="dan"
[root@dan ~~]# age=18
[root@dan ~~]# echo -e "my name is $name my age is $age"
my name is dan my age is 18
还可以输出带颜色(了解即可)
echo -e " 33[31m 红色字 33[0m"
echo -e " 33[34m 黄色字 33[0m"
echo -e " 33[41;33m 红底黄字 33[0m"
echo -e " 33[41;37m 红底白字 33[0m"
# 2.2 prinf命令(C语言风格)
%s
%d
%7.3f 打印浮点数,总宽度为7,小数位保留3位,并且四舍五入
[root@dan ~~]# name="egon"
[root@dan ~~]# age=18
[root@dan ~~]# printf "my name is %s my age is %s
" $name $age
my name is dan my age is 18
[root@dan ~]# salary=3.3339
[root@dan ~]# printf "my name is %s my age is %7.3f
" $name $salary
my name is dan my age is 3.334
三 预定变量
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID # 此外,可以使用只读变量来获取父进程的PID:$PPID、获取执行脚本的用户ID:$UID
$? 上一个命令的返回值 0表示成功
示例1:
[root@dan ~]# chmod +x b.sh
[root@dan ~]# ./b.sh a1 a2 a3 a4 a5
a1 a2 a3 a4 a5
a1 a2 a3 a4 a5
5
18988
1
[root@dan ~]# cat b.sh
#!/usr/bin/env bash
echo $*
echo $@
echo $#
echo $$
ping -c1 192.168.11.10 &>/dev/null
echo $?
示例2:
[root@dan ~]# 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@egon ~]# chmod +x ping.sh
[root@egon ~]# ./ping.sh 192.168.11.10
了解:
如果我们想从命令行中获取脚本调用者传入的参数值,用$n可以取到,但如果脚本调用者在命令行传入的参数个数不固定,那么此时就需要用$*或$@来获取了
$*与$@获取的是所有位置参数,$0除外
当脚本调用者的传参形式如下是
[root@localhost ~]# ./script.sh 命令1 命令2 命令3
针对for循环语句:for i in 元素,for循环会按照空格作为分隔符来一个个取元素,所以此时$*
与$@
并无区别
[root@localhost ~]# cat script.sh
#!/bin/bash
for i in $*
do
echo $i
done
echo "=================="
for i in $@
do
echo $i
done
[root@localhost ~]# ./script.sh 命令1 命令2 命令3
命令1
命令2
命令3
==================
命令1
命令2
命令3
当脚本调用者的传参形式如下时
[root@localhost ~]# ./script.sh 命令1 命令2 "命令3 参数"
针对for循环语句:for i in 元素,for循环会按照空格作为分隔符来一个个取元素,所以此时$*
与$@
如果不加引号,第三个命令:"命令3 参数",为被以空格为分隔符识别成两部分
[root@localhost ~]# cat script.sh
#!/bin/bash
for i in $*
do
echo $i
done
echo "=================="
for i in $@
do
echo $i
done
[root@localhost ~]#
[root@localhost ~]# ./script.sh 命令1 命令2 "命令3 参数"
命令1
命令2
命令3
参数
==================
命令1
命令2
命令3
参数
所以需要为$*
与$@
加上引号
[root@localhost ~]# cat script.sh
#!/bin/bash
for i in "$*"
do
echo $i
done
echo "=================="
for i in "$@"
do
echo $i
done
[root@localhost ~]# ./script.sh 命令1 命令2 "命令3 参数"
命令1 命令2 命令3 参数
==================
命令1
命令2
命令3 参数
[root@localhost ~]#
但此时为$*
就会把所有位置参数识别成一个整体,所以总结如下:
当脚本调用者的传参形式如下时
[root@localhost ~]# ./script.sh 命令1 命令2 "命令3 参数"
需要使用"$@"来分别获取一个个完整的命令
for i in "$@"
do
echo $i
done
其余情况$*与$@完全一致
四 常量
相对于变量,常量就是不可以被改变的量,即只能读不能改,所以又称之为只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
[root@dan ~]# x=111
[root@dan ~]# readonly x
[root@dan ~]# x=666
-bash: x: 只读变量