第二章 变量

一、变量介绍

1)什么是变量?

量指的是记录事物的状态
变指的是事物的状态是可以发生变化的
#变量本质就是一种数据存储的机制,变量的数据都是存放于内存中的

2)为何要有变量?

程序=数据+功能
程序运行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能够反映或者说是保存下来程序执行时状态以及状态的变化
#比如
	英雄2的等级为1,打怪升级(变)为10
	僵尸的存活状态为true,被植物打死了,于是变为false
	人的名字为jh,也可以修改为JH

二、变量的使用

1)先定义、后引用

1.先定义
	#1.语法:变量名=值
	#2.注意:等号左右两边不能有空格!!!
	#3.例如
	[root@localhost shell]# name="jh"
	
2.后引用
	[root@db04 /scripts/day02]# ip="192.168.1.10"
	[root@db04 /scripts/day02]# echo $ip
	192.168.1.10
	
	注意:如果是打印百分比,建议使用$(变量名)%
	[root@db04 /scripts/day02]# percent=44
	[root@db04 /scripts/day02]# echo ${percent}%
	44%

2)删除变量

[root@db04 /scripts/day02]# ip="192.168.1.10"
[root@db04 /scripts/day02]# echo $ip
192.168.1.10
[root@db04 /scripts/day02]# unset ip
[root@db04 /scripts/day02]# echo $ip

[root@db04 /scripts/day02]# 

三、变量的三大组成部分

定义一个变量由三大部分组成:
1.变量名:用来访问到变量值的
2.赋值符号:将变量值的内存地址绑定给变量名
3.变量值:记录的事物的状态,即我们存的数据

1)变量名的命名规范

定义变量把数据存到内存中不是目的,目的是以后要取出来用,而变量名就是用来取变量值的,而变量的名字直接表明了所存值的意义,可见变量名的命名非常重要。

#变量名的命令应该见名知意,同时遵循如下规则
以字母或下划线开头,剩下的部分可以是:字母、数字、下划线,最好遵循下述规范:
  1.以字母开头
  2.使用中划线或者下划线做单词的连接
  3.同类型的用数字区分
  4.对于文件最好加上拓展名
  	如: sql_bak.tar.gz,log_bak.tar.bz2 
  5、不要带有空格、?、*等特殊字符
  6、不能使用bash中的关键字,例如if,for,while,do等
  7、不要和系统环境变量冲突
  
#变量名的命名风格:
  1、纯小写字母加下划线
	age_of_oldboy=18
				
  2、驼峰体
	AgeOfOldboy=18

2)变量值的三种来源

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.与用户交互获取变量值,即通过键盘键入来获取

何为交互,即输入输出

# 1. 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.输出,把程序的处理结果反馈给用户:
#2.1 echo命令格式化输出					
[root@localhost ~]# user="egon"
[root@localhost ~]# age=18
[root@localhost ~]# echo "my name is $user my age is $age"

还可以输出带颜色(了解即可)
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"

案例:
========egon=========
年龄:18
体重:70
身高:181
等级:10
=====================

#2.2 printf命令的格式化输出
%s
%d
%7.3f  打印浮点数,总宽度为7,小数位保留3位,并且四舍五入
printf "my name is %s, my age is %s\n" "egon" 18
printf "my name is %s, my age is %d\n" "egon" 18
						
printf "my name is %s, my salary is %s\n" "egon" 3.337
printf "my name is %s, my salary is %.2f\n" "egon" 3.337
printf "my name is %s, my salary is %8.2f\n" "egon" 3.337
												
x="egon"
y=18
printf "my name is %s, my age is %s\n" $x $y

三、预定变量

$* # 获取所有的位置参数
$@ # 获取所有的位置参数
$# # 获取所有的位置参数个数
$$ # 获取当前shell进程的pid 
   # 此外,可以使用只读变量来获取父进程的PID:$PPID、获取执行脚本的用户ID:$UID
$? 上一个命令的返回值 0表示成功 非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除外

当脚本调用者的传参形式如下是
[root@localhost ~]# ./script.sh 命令1 命令2 命令3

四、常量

相对于变量,常量就是不可以被改变的量,即只能读不能改,所以又称为只读变量
使用readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变

[root@egon ~]# x=111
[root@egon ~]# readonly x
[root@egon ~]# x=666

-bash: x: 只读变量

五、基本数据类型

1.整型:年龄、个数、号码
	age=10
	level=3
	
2.浮点型:薪资、身高、体重
	salary=3.3
	height=1.81
	
	
3.字符串类型:名字、国籍、名人名言、ip地址等描述性质的内容
	msg="hello"
	msg='hello'  # 硬引用,包含的字符均无特殊意义
	
	ps:shell是一门解释型的、弱类型、
		hobbies="抽烟 喝酒 烫头"
			
4.数组类型:
	1)普通数组
		hobbies=("抽烟" "喝酒" "烫头")
		echo ${hobbies[0]}
			
		declare -a array1
         array1[0]=111111111111111

		[root@www ~]# array2=([2]=3.3 [1]=1.1 [3]=4.4)
		[root@www ~]# echo ${array2[1]}
		1.1
		[root@www ~]# echo ${array2[3]}
		4.4
		[root@www ~]# echo ${array2[2]}
		3.3
		[root@www ~]# echo ${array2[0]}

		[root@www ~]#
		
	2)关联数组
		[root@www /scripts/day02]# name="egon"
		[root@www /scripts/day02]# age=18
		[root@www /scripts/day02]# gender="male"
		[root@www /scripts/day02]# info1=("egon" 18 "male")
		[root@www /scripts/day02]# declare -a |grep info1
		declare -a info1='([0]="egon" [1]="18" [2]="male")'
		[root@www /scripts/day02]# 
		[root@www /scripts/day02]# declare -A info2=(["name"]="egon" ["age"]=18 ["gender"]="male")
		[root@www /scripts/day02]# declare -A | grep info2
		declare -A info2='([gender]="male" [name]="egon" [age]="18" )'
		[root@www /scripts/day02]# echo ${info2["name"]}
		egon
		[root@www /scripts/day02]# 

posted @ 2020-11-17 17:03  年少纵马且长歌  阅读(165)  评论(0编辑  收藏  举报