菜单
本页目录

四 bash的变量

1 bash变量:用某个特定字符串代表不固定内容

格式:
		变量名称	=	[值]			#值可以为空

注意:
		1)	变量不能以数字开头
		2)	变量默认为字符串型				#运算采用	$(())
		3)	等号两边不能有空格
		4)	变量值若有空格,用单引号或双引号包括
					双引号中$	\	`有特殊含义,单引号中都表示普通字符
		5)	给变量赋值时,用	\	转义符
		6)	变量叠加:		$变量		或		${变量}
		7)	将命令结果进行赋值:	$()	或	反引号
					关闭变量:		unset	变量名
		8)	字符串中调用变量,用	{ }括起来	
		9)	变量名建议大小写,便于区分
[root@localhost ~]# a=3
[root@localhost ~]# b=4
[root@localhost ~]# echo $((a*b))				#变量默认为字符串型
12
[root@localhost ~]# YQ='hello word'				#变量值若有空格,用单引号或双引号包括
[root@localhost ~]# QY="word hello"
[root@localhost ~]# echo $YQ
hello word
[root@localhost ~]# echo $QY
word hello
[root@localhost ~]# NAME=\$YQ					#给变量赋值时,用	\	转义符
[root@localhost ~]# echo $NAME
$YQ
[root@localhost ~]# echo $PATH		
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# PATH=${PATH}:/root && echo $PATH					#变量叠加	${变量}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root
[root@localhost ~]# PATH=$PATH:/root/bin								#变量叠加	$变量
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root:/root/bin
[root@localhost ~]# unset QY && set |grep QY							#关闭变量
_=QY
[root@localhost ~]# echo "hello${YQ}word"								#字符串中调用变量,用	{ }括起来
hellohello wordword
[root@localhost ~]# echo "hello ${YQ} word"
hello hello word word

2 变量分类

自定义变量:用户自定义

环境变量:

用户id家目录工作目录环境变量值语言
UIDHOMEOLDPWDPATHLANG

位置参数变量:向脚本中传参数

预定义变量:变量名固定,作用也固定

1) 自定义变量

1) 变量定义: 变量名称 = [值]

2) 变量调用: $变量名称

3) 变量查看

		set				#显示所有自定义变量,结合grep查找
			-u			#调用未定义变量会提示(-u开启,+u关闭)
			-x			#执行命令前,先输出一次	(-x开启,+x关闭)
[root@localhost ~]# set |grep YQ						#显示所有自定义变量,结合grep查找
NAME='$YQ'
YQ='hello word'
[root@localhost ~]# set -u 								#开启调用未定义变量会提示
[root@localhost ~]# echo $QY							#未定义的变量出现提示
-bash: QY: 为绑定变量
[root@localhost ~]# echo $YQ
hello word
[root@localhost ~]# set -x 								#开启执行命令前,先输出一次
++ printf '\033]0;%s@%s:%s\007' root localhost '~'
[root@localhost ~]# ls 
+ ls --color=auto
anaconda-ks.cfg
++ printf '\033]0;%s@%s:%s\007' root localhost '~'
[root@localhost ~]# set +u && set +x					#关闭调用未定义变量会提示、关闭执行命令前,先输出一次
+ set +u
+ set +x
[root@loc
2) 环境变量:

环境变量创建、查看、删除

	export			变量名称					#创建环境变量
	env										   #查看环境变量,结合grep查看
	unset			变量名称					#删除变量
[root@localhost ~]# YQ="hello world"
[root@localhost ~]# set |grep YQ
NAME='$YQ'
YQ='hello world'
[root@localhost ~]# env |grep YQ			#查看环境变量,结合grep查看
[root@localhost ~]# export YQ				#创建环境变量
[root@localhost ~]# env |grep YQ			#查看环境变量,结合grep查看
YQ=hello world
[root@localhost ~]# unset YQ				#删除变量
[root@localhost ~]# env |grep YQ
[root@localhost ~]# set |grep YQ
NAME='$YQ'

set:所有变量,以及新建的变量

变量解释
PS1='[\u@\h \W] \ $'命令提示符
PS2='>'#如果第一行命令没有输入完成,第二行命令的提示符
PS4='+'“set -x"用来修改跟踪输出的前缀。(Shell脚本中使用select时的提示符)
PATH查看PAth环境变量的值
#自定义命令提示符	\u用户	@分隔符	\h主机名	\t显示时间	\w显示绝对路径	\W路径最后一个目录	
#					\#执行的第几个命令	\$提示符,若为root用户则会显示#,若为普通用户则会显示$
[root@localhost ~]# PS1='[\u@\h\t\w\#]\$'		
[root@localhost22:54:56~53]#

LANG语系变量

LANG语系
zh_CN.UTF-8中文
en_US.UTF-8英文
3) 位置参数变量: 名称固定,值自定义
位置参数变量解释
$nn为数字,$n表示第n个变量,$0表示命令本身
$#位置参数变量个数
$*把所有参数看成一个整体
$@把所有参数堪称一个整体,区别对待

$* 和 $@ 的区别用for循环能看见

for	循环格式:
		for		变量名称		in		值1	值2	---
		do
			执行命令
			sleep				#一次循环睡眠时间
		done
[root@localhost ~]#cat ./js.sh 			#查看写的一个脚本,实现$n的利用
#!/bin/bash
echo "执行的命令:$0"
echo "第一个数:$1"
echo "运算符号:$2"
echo "第二个数:$3"
echo $(($1$2$3))
[root@localhost ~]#chmod +x ./js.sh 	
[root@localhost ~]#./js.sh 1 + 2			#计算1+2
执行的命令:./js.sh
第一个数:1
运算符号:+
第二个数:2
3
[root@localhost ~]#./js.sh 2 \* 2			#计算2*2
执行的命令:./js.sh
第一个数:2
运算符号:*
第二个数:2
4

[root@localhost ~]#cat /root/num.sh 		#查看一个写的脚本,实现$#统计位置变量个数
#!/bin/bash
echo "$#"
[root@localhost ~]#./num.sh A B C D E F G 
7

[root@localhost ~]#ls
anaconda-ks.cfg  for1.sh  for2.sh  for3.sh  for4.sh  for5.sh  js.sh  num.sh

#结合for循环区别 $*  和 $@ 
[root@localhost ~]#cat /root/for1.sh 
#!/bin/bash
for i in A B C D YQ
do
	echo $i
	sleep 1
done
[root@localhost ~]#./for1.sh
A
B
C
D
YQ
[root@localhost ~]#cat /root/for2.sh
#!/bin/bash
for i in "A B C D E F"
do
	echo $i
	sleep 1
done
[root@localhost ~]#./for2.sh 
A B C D E F
[root@localhost ~]#cat /root/for3.sh 
#!/bin/bash
for i in $1 $2 $3 
do
	echo $i
	sleep 1
done
[root@localhost ~]#./for3.sh A B YQ
A
B
YQ
[root@localhost ~]#cat /root/for4.sh 		# $* 把所有参数看成一个整体
#!/bin/bash
for i in "$*"
do
	echo $i
	sleep 1
done
[root@localhost ~]#./for4.sh A B YQ
A B YQ
[root@localhost ~]#cat /root/for5.sh 		#  $@  把所有参数堪称一个整体,区别对待
#!/bin/bash
for i in "$@"
do 
	echo $i
	sleep 1
done
[root@localhost ~]#./for5.sh A B YQ
A
B
YQ
4) 预定义变量
预定义变量作用
$?查命令是否成功
$$查当前进程PID
$!后台最后一个进程PID
#终端1		执行命令
[root@localhost ~]#cat /root/for6.sh 
#!/bin/bash
echo "$$" >/root/for6.pid						#  $$  查当前进程PID
for i in A B C YQ
do
	echo "$i"
	sleep 300
done
rm -rf /root/for6.pid
[root@localhost ~]#./for6.sh
A
已终止
#终端2		杀死进程
[root@localhost ~]# cat ./for6.pid 
16834
[root@localhost ~]# kill 16834
[root@localhost ~]# kill $(cat /root/for6.pid)

[root@localhost ~]# top &
[1] 16893
[root@localhost ~]# echo $!						#  $!  后台最后一个进程PID
16893

[1]+  已停止               top

接受键盘输入

read 执行中进行赋值

read		[选项]	变量名
		-p			#赋值
		-t			#等待时间
		-n			#字符数量
		-s			#隐藏输入

变量名:
		变量命名可以自定义,如果不指定变量名,会把输入保存入默认变量REPLY
		如果只提供一个变量名,则整个输入行赋予该变量。 
		如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余所有字。
[root@localhost ~]# cat /root/js1.sh 				#结合read命令写一个交互式计算器
#!/bin/bash
read -t 5 -p "请输入第一个数字:" a1
read -n 1 -t 5  -p "请输入运算规则(+-*/):" b1
echo ""
read -t 5 -p "请输入第二个数字:" a2
echo "计算结果:$(($a1$b1$a2))"
[root@localhost ~]# ./js1.sh
请输入第一个数字:13
请输入运算规则(+-*/):+
请输入第二个数字:34
计算结果:47

[root@localhost ~]# cat ./yq.sh 					##结合read命令写一个信息统计
#!/bin/bash
read -t 30 -p "请输入姓名:" name
read -t 30  -n 2 -s -p "请输入年龄:" age
echo ""
read -t 30 -n 1 -p "请输入性别(m/w):" sex
echo ""
read -t 30 -s -p "请输入电话:" num
echo "姓名:$name"
echo "年龄:$age"
echo "性别:$sex"
echo "电话:$num"
[root@localhost ~]# ./yq.sh 
请输入姓名:yangqin
请输入年龄:
请输入性别(m/w):m
请输入电话:姓名:yangqin
年龄:23
性别:m
电话:123456

写个脚本:

#!/bin/bash
#挂载点配置
read -p "请输入挂载点:" point
mkdir $point
if [ "$?" == "0" ];then
        echo "创建挂载点成功----"
else
        read -p "是否需要重新创建(y/n):" point1
        if [ "$point1" == "y" ]
                mkdir $point1
        else
                echo "" 
fi


echo "答案是:$daan"
#配置本地源
cha1=$(ls /etc/yum.repos.d/ |grep CentOS-Base)
if [ "$cha1" == "CentOS-Base.repo" ];then
        mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
else
        echo ""
fi
cha2=$(ls /etc/yum.repos.d/ |grep CentOS-Media)
if [ "$cha2" == "CentOS-Media.repo" ];then
        if [ "$point1" == "1" ];then
cat << EOF >/etc/yum.repos.d/CentOS-Media.repo
[yq.yuan]
name=yq.yuan
baseurl=file://$point1
gpgcheck=0
enabled=1
EOF
        else
cat << EOF >/etc/yum.repos.d/CentOS-Media.repo
[yq.yuan]
name=yq.yuan
baseurl=file://$point
gpgcheck=0
enabled=1
EOF
else
        echo ""
fi
#yum源安装前配置
yum clean all && yum makecache

#yum安装
read -p "请输入需要yum安装的包(gcc*,zlib,pcre,lrzsz):" need1
yum -y install $need1
echo "请上传apache源码包(iso结尾的文件)"
rz

#挂载iso文件,并批量解压
mkdir /LAMP /lamp
echo "创建/LAMP /lamp目录"
mount -o loop /root/LAMP-64.iso /LAMP
echo "挂载iso文件成功---"
cp -a /LAMP/lamp/* /lamp
echo "复制解压包成功"
read -n 1 -p "是否选择解压/lamp目录的所有压缩包(y/n)" need2
if [ "$need2" == "y" ];then
cd /lamp/
for i in $(ls /lamp/*.tar)
do
        tar -xvf $i
done

for j in $(ls /lamp/*.gz)
do
        tar -xvf $j
done
for k in $(ls /lamp/*zip)
do
        yum -y install unzip
        unzip $k
done