菜单
本页目录

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

用户登录过程中会调用其中的默认环境变量,包括

USERLOGNAMEMAILPATHHOSTNAMEHISTSIZEumask
让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

image-20220928195409700

[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"

image-20220928200344352

[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