目录
一,条件语句
1.1条件测试test
test测试文件的表达式是否成立,当条件成立时候,返回值为0,其余时间为非0值。
格式1:test 条件表达式
格式2:[ 条件表达式 ] (条件表达式的两边都需要有空格,且此方法更为常用)
1.2文件测试
文件测试基本格式为:
[ 操作符 文件或目录 ] (注意两端要有空格)
&? 返回0表示条件成立,返回非零值表示条件不成立
&& 逻辑与,"而且"的意思
|| 逻辑或,"或者"的意思
常见的测试操作符
操作符 | 解释 |
-d | 测试是否为目录 |
-e | 测试目录或文件是否存在 |
-a | 测试目录或文件是否存在 |
-f | 测试是否为文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限读取 |
-L | 测试是否为软连接文件 |
解释:条件测试在判断某需求是否满足要求时,需要由测试机制来实现,测试过程中,实现评估布尔声明,以便于在条件性环境进行执行,若为真,则状态码变量$?返回0,若为假,则状态码变量$?返回1(或者不等于0的数)。
举例:
[root@localhost ~]# test -f 1.txt #此处如果不想写[]可以输入test
[root@localhost ~]# echo $?
1 #因为等于1,所以执行为错误
[root@localhost ~]# [ -f 1.txt ]
[root@localhost ~]# echo $?
1 #由于未创建1.txt的文件所以失败
[root@localhost ~]# touch 1.txt
[root@localhost ~]# [ -f 1.txt ] #一定要注意前后空格!!!!!
[root@localhost ~]# echo $?
0 #此处为正确演示
[root@localhost ~]# test -e yanshi.sh &&echo "yes"
yes
[root@localhost ~]# 此处&&表示为前面测试该文件是否存在,如果存在输出yes(此处不验证脚本的正确性)
有一个特别注意的地方:
此处没有任何权限但是显示为0
[root@localhost ~]# ll /etc/shadow
----------. 1 root root 1192 10月 26 08:30 /etc/shadow
[root@localhost ~]# [ -r /etc/shadow ]
[root@localhost ~]# echo $?
0
二,整数测试
1.1整数值比较
命令基本格式
[ 整数1 操作符 整数2 ]
1.2常用的测试操作符
操作符 | 解释 |
-eq | 等于(Equal) |
-ne | 不等于(Not Equal) |
-gt | 大于(Greater Than) |
-lt | 小于(Lesser Than) |
-le | 小于或等于(Lesser or Equal) |
-ge | 大于或等于(Greater or Equal) |
三,字符串测试
1.字符串比较
常用的格式:
格式一:[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式二:[ -z 字符串 ]
2,常用的测试操作符
常用的测试操作符 | 解释 |
= | 第一个字符串和第二个字符串内容相同 |
!= | 第一个字符串和第二个字符串内容不相同,!表示相反的意思 |
-z | 检查字符串内容是否为空,对于未定义或赋予空值的变量将视为空串 |
-n | 检测字符串是否存在 |
四,逻辑测试
1基本格式
格式一: [ 表达式1 ] 操作符 [ 表达式2 ] ...
格式二: 命令1 操作符 命令2 ...
2常用的测试操作符
常用的测试操作符 | 解释 |
&& | 逻辑与,“而且”的意思,使用test命令时,可以将&&改为“-a” |
|| | 逻辑或,“或者”的意思,使用test命令时,可以将||改为“-o” |
! | 逻辑否 |
注意:&&符号不可以在一个[]中使用,但是可以在两个[]之间使用
小脚本:ping
-c:发送包的个数
-i :发送的间隔时间
-W :超时时间
-w :多少秒后停止ping操作
五,分支结构
单分支
if 判断条件;
then 条件为真的分支代码
fi
双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
多分支
if 判断条件1; then
条件1为真的分支代码
elif 判断条件2; then
条件2为真的分支代码
elif 判断条件3; then
条件3为真的分支代码
...
else
以上条件都为假的分支代码
fi
.1case
格式:
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
注意:case支持glob风格的通配符:
* 任意长度任意字符
? 任意单个字符
[] 指定范围内的任意单个字符
| 或者,如: a|b
\n | 输出换行 |
---|---|
\r | 光标移至行首,并且不换行 |
\s | 当前shell的名称,如bash |
\t | 插入Tab键 |
\f | 换行,但光标仍停留在原处 |
\ \ | 表示插入"\"本身 |
\b | 表示退格 不显示钱一个字符 |
五,循环语句echo命令
选项 | 作用 |
---|---|
\n | 输出换行 |
\r | 光标移至行首,并且不换行 |
\s | 当前shell的名称,如bash |
\t | 插入Tab键 |
\f | 换行,但光标仍停留在原处 |
\ \ | 表示插入"\"本身 |
\b | 表示退格 不显示钱一个字符 |
\c | 抑制更多的输出或不换行 |
查看当前系统时间date
-d | 你描述的日期,显示指定字符串所描述的时间,而非当前时间 |
%F | 完整日期格式,等价于%Y-%m-%d |
%T | 时间(24小时制)(hh:mm:ss) |
循环含义:
将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件重复运行次数
循环次数事先已知
循环次数事先未知
六,for
执行机制,便利
执行机制:一次将列表中的元素复制给“变量名”;每次赋值后即执行一次循环体;知道列表中的元素耗尽,循环结束。
如果省略[inWORDS...],此时使用位置变量 in “%$”
$RANDOM 取值范围:0-32767
七,while和until
相对于for,需要知道循环次数
我们只知道停止条件,不知道次数,就需要使用while
直到达到条件
while
当命令判断为假时停止
until
当命令判断为真时停止
双重循环及跳出循环
break跳出单个循环后面加数字2则代表跳出两层循环
continue终止某次循环中的命令,但是不会完全终止命令
八,菜单
#!/bin/bash
PS3="请选择1-11号菜单"
menu="
进行yum安装
关闭sellinux
判断用户是否为root用户
基本信息
磁盘分区
alias
重启网卡
关闭软件"
select menu in $menu
do
case $REPLY in
1)
mount /dev/sr0 /mnt &>/null
cd /etc/yum.repos.d
mkdir bak
mv *.repo bak
touch lgy.repo
echo -e "
[centos7]
name=centos7
baseurl=file:///mnt
gpgcheck=0
enabled=1">lgy.repo
yum clean all
yum install -y tree
;;
2)
echo “$menu”
setenforce 0
;;
3)
if [ `whoami` = "root" ];
then
echo "root用户"
else
echo “非root用户”
fi
;;
4)
name=`hostname`
ip=`ifconfig ens33 |awk /netmask/'{print $2}'`
os=`cat /etc/redhat-release`
kernel=`uname -r`
cpu=`lscpu |grep 型号名称:|tr -s " "|cut -d":" -f2`
mem=`free -hm |awk /Mem/'{print $2}'`
space=`lsblk |awk /disk/'{print $4}' |awk -F G '{print $1}'`
G="\e[1;32m"
B="\e[1;34m"
E="\e[0m"
for i in $space
do let sum=$[$sum+$i]
done
echo -e "$B主机名:$E$G\t$name\t$E"
echo -e "${B}IP地址:$E$G\t$ip\t$E"
echo -e "$B系统版本:$E$G\t$os\t$E"
echo -e "$B内核版本:$E$G\t$kernel\t$E"
echo -e "${B}cpu名称:$E$G\t$cpu\t$E"
echo -e "$B内存总大小$E:$G\t$mem\t$E"
echo -e "$B硬盘总大小$E:$G\t${sum}G\t$E"
;;
5)
echo "- - -"> /sys/class/scsi_host/host0/scan
echo "- - -"> /sys/class/scsi_host/host1/scan
echo "- - -"> /sys/class/scsi_host/host2/scan
fdisk /dev/sdb<<lgy
p
n
1
2048
+10G
p
w
lgy
mkfs .xfs /dev/sdb1
mount /dev/sdb1 /opt/data/aa
;;
6)
.bashrc
alias gg="systemctl restart firewalld.service"
;;
7)
ens33="/etc/sysconfig/network-scripts/ifcfg-ens33"
cat $ens33
sed '/^ONBOOT/s/no/yes/' $ens33
sed '/^BOOTPROTO/s/DHCP/static/' $ens33
#修改IP地址
read -p "输入IP地址:" IP
sed -i "7a IPADDR=${IP}" $ens33
sed -i "8a NETMASK=255.255.255.0" $ens33
read -p "输入GATEWAY地址:" GATE
sed -i "9a GATEWAY=${GATE}" $ens33
read -p "输入dns1: "dns
sed -i "10a dns1=${dns}" $ens33
#重启网卡
systemctl restart network
break
;;
8)
exit”
esac
done
echo “完成”
版权声明:本文为m0_60353617原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。