4 shell运算符
1) declare 命令
declare [+-] [子选项] 变量名
- 设置属性
+ 取消属性
-a 声明为属组型
[root@localhost ~]# yq[0]=0
[root@localhost ~]# yq[1]=1
[root@localhost ~]# yq[2]=2
[root@localhost ~]# set |grep yq
yq=([0]="0" [1]="1" [2]="2")
[root@localhost ~]# echo ${yq[*]}
0 1 2
-i 声明为整数型
-x 声明为环境变量 类似export
-r 添加为只读属性
-p 查看
注意:传子不传夫
父shell设置的环境变量子shell能看到,子shell设置的环境变量父shell无法查看
[root@localhost ~]# declare -r yy # -r 添加为只读属性
[root@localhost ~]# set |grep yy
_=yy
[root@localhost ~]# declare -r yy=1
-bash: declare: yy: 只读变量
[root@localhost ~]# unset yy
-bash: unset: yy: 无法反设定: 只读 variable
[root@localhost ~]# declare -p yq # -p 查看
declare -a yq='([0]="0" [1]="1" [2]="2")'
2) shell运算符 实现计算(先乘除后加减,有括号最先算)
$(())
[root@localhost ~]# js=$((2*(2+3)))
[root@localhost ~]# echo $js
10
5 变量的测试与内容置换
可用于判断,用于脚本中
| 置换方式 | y没有设置值 | y值为空 | y设置值 |
|---|---|---|---|
| x=${y-新值} | x=新值 | x为空 | x=$y |
五 环境变量配置文件
1 全局、局部
## 修改配置文件后,需要执行 source 文件 使生效(或 . 文件 或 重新登录)
全局环境变量配置文件:/etc/profile
用户登录过程中会调用其中的默认环境变量,包括
| USER | LOGNAME | PATH | HOSTNAME | HISTSIZE | umask | |
|---|---|---|---|---|---|---|
| 让user变量是当前用户 | 根据USER变量进行赋值 | 根据用户定义邮件目录下的用户名 | 若用户UID不为0,则不包含/sbin /usr/sbin /usr/local/sbin三个系统命令目录 | 更改主机名赋予的变量 | 定义历史命令保存条数 | 用户登录后给予默认umask值 |
/etc/profile.d/*.sh 有很多.sh结尾的脚本,被/etc/profile调用
/etc/bashrc 定义了PS1、默认umask、PATH
局部
~/.bashrc 调用/etc/bashrc
~/.bash_profile 定义别名
注意:在7.3和7.6版本的centos中,额外写入到/etc/profile文件的变量定义并不会在 正常登录后生效。在su -切换用户后生效。建议写入到/etc/bashrc或/~/.bashrc中。
练习:判断四个配置文件生效顺序
## 在四个文件中加入 echo "文件名"
[root@localhost ~]# echo "echo '/etc/profile'" >> /etc/profile
[root@localhost ~]# vim /etc/profile
[root@localhost ~]# echo "echo '/etc/bashrc'" >> /etc/bashrc
[root@localhost ~]# echo "echo '/root/.bashrc'" >> /root/.bashrc
[root@localhost ~]# echo "echo '/root/.bash_profile'" >> /root/.bash_profile
/etc/profile #1
/etc/bashrc #2
/root/.bashrc #3
/root/.bash_profile #4
2 注销时生效的配置文件:
./bash_logout (可写sync)
3 shell登录信息
## 1) /etc/issue (本地字符界面,登录前显示)
文件中生效的选项
\s 当前系统版本
\r 显示内核版本
\m 硬件平台
\t 时间
## 2) /etc/issue.net (远程登录前显示)
如:/etc/ssh/sshd_config中取消注释banner行,并改成banner /etc/issue.net
## 3) /etc/motd (本地、远程登录后显示)
## 4) 定义bash快捷键
stty -a #查看
stty intr ^P
[root@localhost ~]# vim /etc/issue #本地字符界面,登录前显示
\S
Kernel \r on an \m
\t

[root@localhost ~]# vim /etc/ssh/sshd_config #/etc/issue.net (远程登录前显示)
[root@localhost ~]# cat /etc/ssh/sshd_config |grep Banner
Banner /etc/issue.net
[root@localhost ~]# systemctl restart sshd
Connecting to 192.168.18.134:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
\S
Kernel \r on an \m
Last login: Wed Sep 28 19:56:35 2022 from 192.168.18.1
[root@localhost ~]# vim /etc/motd
[root@localhost ~]# cat /etc/motd
echo "welcome"

[root@localhost ~]# stty -a #查看设置的bash快捷键
speed 38400 baud; rows 32; columns 145; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
写两个脚本
[root@localhost ~]# cat ./jy3.sh #查看所有压缩包
#!/bin/bash
rm -rf /root/yasuo/* #删除/root/yasuo目录下所有文件
for i in /lamp/* #定义i为lamp目录下的所有压缩包
do
for j in /lamp/*.zip #定义j为lamp目录下,所有以.zip结尾的压缩包
do
if [ "$i" == "$j" ];then #如果变量i和j相等
unzip $j -d /root/yasuo/ #采用zip解压
else
tar -xvf $i -C /root/yasuo/ #弱国i和j不相等,则采用tar解压
fi
done
done
[root@localhost ~]# vi yuan.sh
#!/bin/bash
#挂载点配置
cha4=$(df -h |grep /dev/sr0 |awk '{print $1}') #定义cha4,对df -h命令找查光盘,行过滤,列过滤
while [ "$cha4" == "/dev/sr0" ] #如果变量cha4为/dev/sr0,则一直执行命令卸载光盘
do
umount $cha4
done
rm -rf /disk*
read -p "请输入挂载点:" point #交互式创建变量,确定挂载点
mkdir $point #创建挂载点
if [ "$?" == "0" ];then #如果挂载点创建成功,则挂载光盘
echo "创建挂载点成功----"
mount /dev/sr0 $point
else #如果挂载点创建失败,则考虑是否已经存在定义的挂载点
read -p "是否重新选择挂载点(y/n):" point1 #交互式重新定义是否重新创建挂载点
if [ "$point1" == "y" ];then #如果确定新建挂载点,则进入if循环
read -p "请输入新挂载点:" point2 #定义新挂载点
mkdir $point2
mount /dev/sr0 $point2
else
mount /dev/sr0 $point #如果不新建挂载点,则采用第一次定义的挂载点进行挂载
fi
fi
#配置本地源
cha1=$(ls /etc/yum.repos.d/ |grep CentOS-Base) #定义变量cha1,以判断是否存在网络源,若存在,则进行注释,若不存在,则进行下一步
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) #定义cha2变量,判断本地源名字,若名字对应上,则进入下一个判断
if [ "$cha2" == "CentOS-Media.repo" ];then
if [ "$point1" == "y" ];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
fi
else
echo "" #因为采用覆盖式写入文件,若文件名对应不上,或者不存在该文件,则会自动创建文件并覆盖式写入
fi
yum clean all && yum makecache #清理yum源,并生成新yum源的缓存
#yum安装
read -p "请输入需要yum安装的包(gcc*,zlib,pcre,lrzsz,unzip):" need1 #交互式确定需要yum安装的包
yum -y install $need1
echo "请上传apache源码包(iso结尾的文件)"
rz #上传apache源码包(iso结尾的文件)
#挂载iso文件,并批量解压
mkdir /LAMP /lamp #新建目录,进行iso文件挂载
echo "创建/LAMP /lamp目录"
mount -o loop /root/LAMP-64.iso /LAMP
echo "挂载iso文件成功---"
rm -rf /lamp/*
cp -a /LAMP/lamp/* /lamp
echo "复制解压包成功"
read -n 1 -p "是否选择解压/lamp目录的所有压缩包(y/n)" need2 #交互式选择是否需要解压所有压缩包
echo ""
if [ "$need2" == "y" ];then
cd /lamp/
[root@localhost ~]# cat ./jy3.sh #解压所有压缩包
#!/bin/bash
rm -rf /root/yasuo/* #删除/root/yasuo目录下所有文件
for i in /lamp/* #定义i为lamp目录下的所有压缩包
do
for j in /lamp/*.zip #定义j为lamp目录下,所有以.zip结尾的压缩包
do
if [ "$i" == "$j" ];then #如果变量i和j相等
unzip $j -d /root/yasuo/ #采用zip解压
else
tar -xvf $i -C /root/yasuo/ #弱国i和j不相等,则采用tar解压
fi
done
done