文章目录
变量
一 、变量介绍
1、什么是变量?
变:指的是事物的状态是可以发生变化的
量:指的是记录事物的状态
变量:本质就是一种数据存取的机制,变量的数据都是存放于内存中的
2、为何要有变量?
程序运行的本质就是一系列状态的变化
程序=数据+功能,
程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能够反映或者说是保存下来程序执行时状态以及状态的变化。
# 比如:
英雄的等级为1,打怪升级(变)为10
僵尸的存活状态True,被植物打死了,于是变为False
人的名字为egon,也可以修改为Egon
二、变量的使用
1、先定义、后引用
先定义
# 1、语法:变量名=值
# 2、注意:等号左右两边不能有空格!!!
# 3、例如:
[root@localhost shell]# name="egon"
后引用
[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、删除变量
[root@localhost shell]# x=111
[root@localhost shell]# unset x
[root@localhost shell]# echo $x
[root@localhost shell]#
三、变量的三大组成部分
1、定义一个变量由三大部分组成
-
1、变量名:用来访问到变量值的
-
2、赋值符号:将变量值的内存地址绑定给变量名
-
3、变量值:即我们存的数据
2、变量名的命名规范
定义变量把数据存到内存中不是目的,目的是以后要取出来用;
而变量名就是用来取变量值的,而变量的名字直接表明了所存值的意义,可见变量名的命名非常重要!
变量名的命令应该见名知意,同时遵循如下规则
# 以字母或下划线开头,剩下的部分可以是:字母、数字、下划线,最好遵循下述规范:
1.以字母开头
2.使用中划线或者下划线做单词的连接
3.同类型的用数字区分
4.对于文件名的命名最好在末尾加上拓展名 # 例如: sql_bak.tar.gz,log_bak.tar.bz2
5.不要带有空格、?、*等特殊字符
6.不能使用bash中的关键字,例如if,for,while,do等
7.不要和系统环境变量冲突
3、变量值的三种来源
1)直接赋值
# 1. 显式赋值:变量名=变量值
示例:
ip1=192.168.11.200
school="Shanghai oldboy"
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@egon ~]# 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@egon ~]# chmod +x b.sh
[root@egon ~]# ./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@egon ~~]# name="egon"
[root@egon ~~]# age=18
[root@egon ~~]# echo -e "my name is $name my age is $age"
my name is egon my age is 18
还可以输出带颜色(了解即可)
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[34m 黄色字 \033[0m"
echo -e "\033[41;33m 红底黄字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
# 2.2 prinf命令(C语言风格)
%s
%d
%7.3f 打印浮点数,总宽度为7,小数位保留3位,并且四舍五入
[root@egon ~~]# name="egon"
[root@egon ~~]# age=18
[root@egon ~~]# printf "my name is %s my age is %s\n" $name $age
my name is egon my age is 18
[root@egon ~]# salary=3.3339
[root@egon ~]# printf "my name is %s my age is %7.3f\n" $name $salary
my name is egon my age is 3.334
三、预定变量
1、$与组合符介绍
$# 参数的个数
$$ 当前进程的PID # 此外,可以使用只读变量来获取父进程的PID:$PPID、获取执行脚本的用户ID:$UID
$? 上一个命令的返回值 0表示成功
$* 所有的参数,不加双引号与$@完全一致,都会把位置参数当成一个“个体”
"$*" # 此时把所有位置参数当成一个整体(以行的方式打印)
$@ 所有的参数,不加双引号与$*完全一致,都会把位置参数当成一个“个体”
"$#" # 此时会把所有位置参数当成一个单独的字段(以列的方式打印)
示例1:
[root@egon ~]# chmod +x b.sh
[root@egon ~]# ./b.sh a1 a2 a3 a4 a5
a1 a2 a3 a4 a5
a1 a2 a3 a4 a5
5
18988
1
[root@egon ~]# cat b.sh
#!/usr/bin/env bash
echo $*
echo $@
echo $#
echo $$
ping -c1 192.168.11.10 &>/dev/null
echo $?
示例2:
[root@egon ~]# 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除外
2、举例介绍 @ 与 @与 @与*的区别
例1:for循环下默认按空格分隔
$* 与 $@ 不加引号情况下
针对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
例2:被空格分隔为两部分
$* 与 $@ 不加引号情况下
针对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 ~]# ./script.sh 命令1 命令2 "命令3 参数"
命令1
命令2
命令3
参数
==================
命令1
命令2
命令3
参数
例3:加引号以后
所以需要为`$*`与`$@`加上引号
[root@localhost ~]# cat script.sh
#!/bin/bash
for i in "$*"
do
echo $i
done
echo "=================="
for i in "$@"
do
echo $i
done
当脚本调用者的传参形式如下时,打印效果为下
"$*"以行显示,且会被空格分隔符分开,将"命令3 参数"给识别为两个个体
"$@"以列显示,"命令3 参数"还是为一个整体
[root@localhost ~]# ./script.sh 命令1 命令2 "命令3 参数"
命令1 命令2 命令3 参数
==================
命令1
命令2
命令3 参数
总结
当脚本调用者的传参形式如下时,脚本内容需要使用"$@"来分别获取一个个“完整”的命令,其余情况$*与$@完全一致!
[root@localhost ~]# ./script.sh 命令1 命令2 "命令3 参数"
命令1 命令2 命令3 参数
==================
命令1
命令2
命令3 参数
[root@localhost ~]# cat script.sh
for i in "$@"
do
echo $i
done
四、常量
相对于变量,常量就是不可以被改变的量,即只能读不能改,所以又称之为只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
[root@egon ~]# x=111
[root@egon ~]# readonly x
[root@egon ~]# x=666
-bash: x: 只读变量