四 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 | 家目录 | 工作目录 | 环境变量值 | 语言 |
|---|---|---|---|---|
| UID | HOME | OLDPWD | PATH | LANG |
位置参数变量:向脚本中传参数
预定义变量:变量名固定,作用也固定
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) 位置参数变量: 名称固定,值自定义
| 位置参数变量 | 解释 |
|---|---|
| $n | n为数字,$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