一.shell介绍
Shell 也是一种程序设计语言,它有变量,关键字,各种控制语句,有自己的语法结构,利用shell程序设计语 言可以编写功能很强、代码简短的程序。
shell是外壳的意思,就是系统的外壳,我们可以通过shell的命令来控制和操作操作系统,比如linux中的shell命令就包括ls、cd、pwd等等,总结来说shell就是一个命令解释器,他通过接收用户输入的shell命令来启动、停止程序的运行或者对计算机进行控制。
1.通配符置换
[root@linux-server tmp]# rm -rf ./*
[root@linux-server tmp]# touch aabcb axyzb a012b ab acb
[root@linux-server tmp]# ls
a012b aabcb ab acb axyzb
[root@linux-server tmp]# ls a*b
a012b aabcb ab acb axyzb
[root@linux-server tmp]# ls a?b
acb
[root@linux-server tmp]# rm -rf ./*
[root@linux-server tmp]# touch axb ayb azb axyb
[root@linux-server tmp]# ls
axb axyb ayb azb
[root@linux-server tmp]# ls a[xy]b
axb ayb
[root@linux-server tmp]# ls a[!xy]b
azb
[root@linux-server tmp]# ls a[!x]b
ayb azb
[root@linux-server tmp]# rm -rf ./*
[root@linux-server tmp]# touch a0b a1b a9b
[root@linux-server tmp]# ls a[0-9]b
a0b a1b a9b
[root@linux-server tmp]# rm -rf ./*
[root@linux-server tmp]# touch aabcb axyzb a012b ab
[root@linux-server tmp]# ls a{abc}b
ls: cannot access a{abc}b: No such file or directory
[root@linux-server tmp]# ls a{abc,xyz}b
aabcb axyzb
[root@linux-server tmp]# ls a{abc,xyz,012}b
a012b aabcb axyzb
2.shell脚本编写
脚本一 vim fxr.sh
脚本二 vim fxr02.sh
[root@linux-server ~]# chmod +x fxr02.sh #对文件进行授权
[root@linux-server ~]# bash fxr02.sh # 执行脚本
hello world
脚本测试
1.这将执行该脚本并显示所有变量的值
[root@linux-server ~]# sh -x /root/fxr02.sh
+ printf 'hello world\n'
hello world
2.不执行脚本只是检查语法模式,将返回所有错误语法
[root@linux-server ~]# sh -n /root/fxr02.sh
3.执行脚本前把脚本内容显示在屏幕上
[root@linux-server ~]# sh -v /root/fxr02.sh
#!/bin/bash
printf "hello world\n"
hello world
二·.变量介绍
1.自定义变量设置
[root@linux-server ~]# a=123
[root@linux-server ~]# echo $a
123
此为临时变量当重新设定新的shell时临时变量消失
[root@linux-server ~]# bash
[root@linux-server ~]# echo $a
2.环境变量
[root@linux-server ~]# export a=100
[root@linux-server ~]# echo $a
100
[root@linux-server ~]# bash
[root@linux-server ~]# echo $a
100
# 重新生成shell则不消失
3.修改配置文件
[root@linux-server ~]# vim /etc/profile
加入export a=100
练习1
编写执行主机信息的脚本
编写一个shell脚本,用于搜集其执行主机的信息,打印结果如下:
[root@linux-server ~]# mkdir /opt/test/script
[root@linux-server ~]# cd /opt/test/script
[root@linux-server script]# vim test.sh
[root@linux-server script]# chmod +x test.sh
[root@linux-server script]# ./test.sh
现在的时间是: 2020-08-22-17:34:03
当前的用户是: root
当前的用户标识: 0
当前的主机名称是: linux-server
当前可用网卡IP是: 192.168.246.148/24
##脚本源码如下
#!/usr/bin/bash
获取主机基本信息
time=date +%F-%T
ip=ip a | grep ens33 | awk 'NR==2 {print $2}'
echo “现在的时间是:” $time
echo “当前的用户是:” $USER
echo “当前的用户标识:” $UID
echo “当前的主机名称是:” $HOSTNAME
echo “当前可用网卡IP是:” $ip
[root@linux-server script]# source test2.sh
现在的时间是: 2022-07-05-19:02:36
当前的用户是: root
当前的用户标识: 0
当前的主机名称是: linux-server
当前可用网卡IP是: 192.168.21.130/24
[root@linux-server ~]# df -Th | awk 'NR==6 {print $5}'
[root@linux-server ~]# echo 现在cpu的`uptime | cut -d, -f3- `
现在cpu的 load average: 0.08, 0.14, 0.14
[root@linux-server ~]# echo 现在cpu的`uptime | awk -F "," '{print $3,$4,$5}'`
现在cpu的 load average: 0.19 0.16 0.14
vim weizhi.sh
#!/usr/bin/bash
echo 我的第一个位置参数是:$1
echo 我的第二个位置参数是:$2
echo 我的第三个位置参数是:$3
echo 我的第四个位置参数是:$4
echo 一共有 KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ 个位置参数 echo 你输…*
[root@linux-server ~]# cd /opt/test/script/
[root@linux-server script]# vim weizhi2.sh
[root@linux-server script]# chmod +x weizhi2.sh
[root@linux-server script]# ./weizhi2.sh 1 3 4 6
我的第一个位置参数是:1
我的第二个位置参数是:3
我的第三个位置参数是:4
我的第四个位置参数是:6
一共有 4 个位置参数
你输入的参数分别是:1 3 4 6
浮点运算
bash本身不能做小数计算:需要bc命令转换
# yum install -y bc
# echo "2.6*4" | bc
# echo "2^4" | bc
完全引用:'' #强引 硬引 #指的是被引号包围起来的变量名不会进行不会进行解析,原样变量名原样输出,这种方式比较适合定义显示纯字符串的情况,不希望解析变量、命令等的场景。
部分引用:"" #弱引 软引 #指的是被引号包围起来的变量名会先进行解析,然后将变量的解析结果输出来。这种方式适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。
读取用户标准输入:read
#!/bin/bash
# read test
read -p "请输入你的银行卡帐号" num
read -p "请在五秒输入密码" -t 5 pass #五秒
echo "你的密码错误!"
echo $num
echo $pass
~
随机数
#脚本中常用的方式
echo "$a和$b的和是: `expr $a '+' $b`"
=================================================================
取1到6之间的随机数:
# echo $RANDOM
# echo $(($RANDOM % 6 + 1))
5
取1-10之间的随机数:
# echo $(($RANDOM % 10 + 1)
5
脚本练习
1.ping主机测试
#!/bin/bash
ping -c 1 192.168.21.130
if [ $? = 0 ]
then
echo "ping成功"
else
echo "ping失败"
fi
~
2.判断一个用户是否存在
#!/bin/bash
read -p "输入用户名:" name
id $name
if [ $? = 0 ]
then
echo "用户存在"
else
echo "用户不存在"
fi
3.判断当前内核主版本是否为3,且次版本是否大于10
#!/bin/bash
main=` uname -r | awk -F '.' '{print $1}'`
sec=` uname -r | awk -F '.' '{print $2}'`
if [ $main -eq 3 ]&&[ $sec -gt 10 ]
then
echo "符合要求"
else
echo "不符合要求"
fi
4.判断vsftpd软件包是否安装,如果没有则自动安装 (yum是否能用,不能用自动修复,安装完成测试以下,是否能用。)
#!/bin/bash
rpm -qa | grep vsftpd
if [ $? -eq 0 ]
then
echo "vsftpd以安装"
else
yum -y install vsftpd
if [ $? -eq 0 ]
then
echo "yum无问题"
else
yum clean
yum macecache
fi
fi
5.判断指定的主机是否能ping通,必须使用$1变量
#!/bin/bash
#read -p "请输入主机ip:" $1
ping -c 2 $1 &> /dev/null
if [ $? -eq 0 ];then
echo "主机可以ping通"
else
echo "主机不可以ping通"
fi
~
6.判断用户输入的是否是数字
read -p “请输入:” get
case $get in
[0-9][0-9]*) #判断输入是否是数字
echo -e “你输入是数字。\n”
;;
*)
echo -e “你输入的不是数字。\n”
;;
esac
#!/bin/bash
read -p "请输入:" get
case $get in
[0-9])
echo -e "你输入是数字。\n"
;;
[0-9][0-9]*)
echo -e "你输入是数字。\n"
;;
*)
echo -e "你输入的不是数字。\n"
;;
esac
7.建立脚本service.sh,当执行的时候要求输入(1、2、3、4、5)时安装对应的httpd、vim、wget、更换aliyum等功能,当输入错误 时会提示你,应该输入正确的值。
EOF
i=1
while 1>0
do
read -p "请输入选项:" num
case $num in
1) yum -y install httpd
;;
2) yum -y install vim
;;
3) yum -y install wget
;;
4) wegt http://mirrors.aliyun.com/repo/Centos-7.repo
yum -y install epel-release
yum clean all
yum makecache
yum repolist
;;
*)
printf"请输入以上选项\n"
;;
8.批量删除指定用户
#!/bin/bash
read -p "请输入用户名/数量:" name num
cat <<-EOF
$name
$num
EOF
for i in $(seq 1 $num)
do
user=$name$i
id $name$i &> /dev/null
if [ $? -eq 0 ]
then
echo "用户存在"
userdel -r $name$i
else
echo "用户不存在"
fi
done
7.猜拳游戏
cat <<-EOF
===================
1.石头
2.剪刀
3.布
===================
EOF
read -p "输入选择 : " num
mnum=$[RANDOM%3+1]
case $mnum in
1)
echo "电脑-1.石头"
;;
2)
echo "电脑-2.剪刀"
;;
3)
echo "电脑-3.布"
;;
esac
case $num in
1)
if [ $mnum -eq 2 ];then
echo "你赢了"
elif [ $mnum -eq 3 ];then
echo "你输了"
else
echo "平局"
fi
;;
2)
if [ $mnum -eq 1 ];then
echo "你输了"
elif [ $mnum -eq 3 ];then
echo "你赢了"
else
echo "平局"
fi
;;
3)
if [ $mnum -eq 1 ];then
echo "你赢了"
elif [ $mnum -eq 2 ];then
echo "你输了"
else
echo "平局"
fi
;;
esac
第二种参考
原文```c
#!/bin/bash
#Author:nhx
game=(石头 剪刀 布)
num=$[RANDOM%3]
computer=${game[$num]}#通过随机数获取计算机的出拳
#echo "${computer}"
#出拳的可能性保存在一个数组中,game[0],game[1],game[2]分别是3中不同的可能
echo "请根据下列提示选择你的出拳手势"
echo "1.石头"
echo "2.剪刀"
echo "3.布"
read -p "请选择 1-3:" person
case $person in
1)
if [ $num -eq 0 ];then
echo "平局"
elif [ $num -eq 1 ];then
echo "你赢"
else
echo "计算机赢"
fi;;
2)
if [ $num -eq 0 ];then
echo "计算机赢"
elif [ $num -eq 1 ];then
echo "平局"
else
echo "你赢"
fi;;
3)
if [ $num -eq 1 ];then
echo "你赢"
elif [ $num -eq 1 ];then
echo "计算机赢"
else
echo "平局"
fi;;
*)
echo "必须输入1-3的数字"
esac
7-8练习
1、创建一个脚本,执行该脚本可以显示如下内容:
a.当前你使用的用户名是:***
b.当前所在目录是:****
#!/bin/bash
cat <<-EOF
a.当前你使用的用户名是:***
b.当前所在目录是:****
EOF
2、创建一个脚本,该脚本可以根据你输入的日期计算出你还有多少天过生日。
提示部分:
#!/bin/bash
read -p “请输入你生日,格式如07-28:” num
year=date +%Y
#先算出生日是今年的第几天
A=date -d ${year}-${num} +%j
#再算出今天是今年的第几天
B=date +%j
请继续书写脚本:
#!/bin/bash
read -p "请输入你生日,格式如07-28:" num
year=`date +%Y`
#先算出生日是今年的第几天
A=`date -d ${year}-${num} +%j`
#再算出今天是今年的第几天
B=`date +%j`
if [ $A -gt $B ]
then
echo $(($A-$B))
else
#判断闰年
if [ $(($year%4)) -eq 0 ]&&[ $(($year%100)) -ne 0 ]||[ $(($year%400)) -eq 0 ]
then
echo $(($B-$A+366))
else
echo $(($B-$A+365))
fi
fi
3、创建一个脚本,执行脚本后让用户输入一个数字,程序可以判断用户输入的是正整数还是负整数或者是0。
#!/bin/bash
read -p "输入数字:" num
if [ $num -eq 0 ]
then
echo "结果是0"
elif [ $num -gt 0 ]
then
echo "结果是正整数"
else
echo "结果是负整数"
fi
4、创建一个脚本,脚本作用如下:
a.先查看/tmp/alan这个名称的普通文件是否存在
b.若不存在则创建一个普通文件,然后退出脚本
c.若存在该普通文件则判断该名称是否是普通文件,若是普通文件则删除此文件并创建一个同名的目录,之后退出。
d.如果存在且为目录,则删除此目录。
#!/bin/bash
#判断文件是否存在
if [ ! -e /tmp/alan ]
then
touch /tmp/alan
#判断/tmp/alan是否为文件
elif [ -f /tmp/alan ]
then
rm -rf /tmp/alan && mkdir -p /tmp/alan
#d.如果存在且为目录,则删除此目录。
else
rm -rf /tmp/alan
fi
~
5、创建一个脚本,该脚本可以收集用户输入的两个值来比较对应数字的大小,要求该脚本可以检测用户输入的是否是整数。
#!/bin/bash
while :
do
read -p "比较大小:" num1 num2
expr $num1 + $num2 &> /dev/null
if [ $? -ne 0 ]
then
echo "不是整数"
continue
fi
if [ $num1 -eq $num2 ]
then
echo " $num1 等于 $num2 "
elif [ $num1 -gt $num2 ]
then
echo " $num1 大于 $num2 "
else
echo " $num1 小于 $num2 "
fi
done
6、写一个脚本,可以计算出从1到用户输入的数字之和,同时需要判断用户输入的是否是正整数。
(例如:用户如数的是5,则计算1+2+3+4+5=15)
#!/bin/bash
read -p "输入数字: " num
sum=0
for((i=1;i<=$num;i++))
do
sum=$(( $sum + $i ))
done
echo $sum
if [ $sum -gt 0 ]
then
echo "结果是正数"
fi
![在这里插入图片描述](https://img-blog.csdnimg.cn/5aff147178214f6d96191aa8f94cf926.png)