shell脚本一看就会,学习无压力

目录

一,条件语句

1.1条件测试test

1.2文件测试

二,整数测试

1.1整数值比较

1.2常用的测试操作符

三,字符串测试

1.字符串比较

2,常用的测试操作符

四,逻辑测试

1基本格式

2常用的测试操作符

五,循环语句echo命令

六,for

七,while和until

八,菜单


一,条件语句

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版权协议,转载请附上原文出处链接和本声明。