shell脚本

一、shell 脚本的构成

脚本声明

注释信息

可执行语句
二、变量
1 )自定义变量
由用户自己定义、使用和修改
变量名 = 值中,等于号 = 之前和之后不能有空格,比如: name = yang
这样是错的, name=yang 才对
变量名= 值中,值内如果输入数学算式,是没办法算出结果的,只会输出字符串。
2 )环境变量
$PWD
$SHELL
$USER
$PATH
[root@localhost ~]# env # 查看所有环境变量
...
SSH_CONNECTION=192.168.100.1 56964 192.168.100.100 22
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
HOSTNAME=localhost.localdomain
which_declare=declare -f
XDG_SESSION_ID=1
USER=root
SELINUX_ROLE_REQUESTED=
PWD=/root
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
HOME=/root
SSH_CLIENT=192.168.100.1 56964 22
SELINUX_LEVEL_REQUESTED=
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/va
r/lib/flatpak/ex
ports/share:/usr/local/share:/usr/share
SSH_TTY=/dev/pts/0
MAIL=/var/spool/mail/root
TERM=xterm
SHELL=/bin/bash
SELINUX_USE_CURRENT_RANGE=
SHLVL=1
LOGNAME=root
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus
XDG_RUNTIME_DIR=/run/user/0
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/ro
ot/bin
DEBUGINFOD_URLS=https://debuginfod.centos.org/
HISTSIZE=1000
LESSOPEN=||/usr/bin/lesspipe.sh %s
BASH_FUNC_which%%=() { ( alias;
eval ${which_declare} ) | /usr/bin/which --tty-only --
read-alias --read-f
unctions --show-tilde --show-dot $@
}
_=/usr/bin/env
OLDPWD=/root/shell
[root@localhost ~]# echo $PWD
/root
[root@localhost ~]# echo $SHELL
/bin/bash
[root@localhost ~]# echo $USER
root
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bi
n
[root@localhost ~]#

3)位置变量

通过命令行给脚本程序传递参数 ( 也属于预定义变量 )
为了在使用 Shel 脚本程序时,方便通过命令行为程序提供操作参数,
Bash 引入了位置变量的概念位置变量有 n n 1~9 之间的数字
$0 :第一个字段表示命令名或脚本名称
$1 :脚本要处理的第一个参数
$2 :脚本要处理的第二个参数
....
Shell 脚本最多可以直接处理 9 个参数
4 )预定义变量
Bash 中内置的一类变量,不能直接修改
预定义变量是 Bash 程序预先定义好的一类特殊变量,用户只能使用预定
义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。
$* :将所有参数作为整体
$@ :单个参数的组合,每个参数占一行
$0 :保存了脚本名称
$? :保存命令或脚本的执行状态码
$# :保存脚本要处理的参数的个数
三、判断语法
(1)条件判断
Shell 的返回值:运行一条命令,都会有一个返回值。 0 代表执行正常,非 0 代表命令执行异常。
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
[root@localhost test]# echo $? # $?保存了上条命令的返回值,0表示执行成功,非0表示执
行失败
0
[root@localhost test]# ls /haha
ls: ⽆法访问'/haha': 没有那个⽂件或⽬录
[root@localhost test]# echo $?
2
[root@localhost test]#
二、 if 条件判断语句
1、if 单分支语句
if 条件判断; then
     条件成⽴执⾏的命令(可以有多个命令,命令执行方式为逐行执行要么全执行,要么全不执行)
fi
2、if 多分支语句
if 条件判断; then
     条件成⽴执⾏的命令(可以有多个命令)
else
     条件不成⽴执⾏的命令(可以有多个命令)
fi

数字判断

-eq equal ,等于,一般用于 [ $? -eq 0 ] ,也就是判断上条命令返回值等于 0 ,直接数字 -eq
字也可以 equals
-ne not equal ,不等于,一般用于 [ $? -ne 0 ] ,判断上条命令返回值不等于 0
-gt greater than ,大于
-ge greater or equal ,大于或等于
-lt less than ,小于
-le less or equal ,小于或等于
创建检测网络是否畅通的脚本
[root@localhost test]# vim ping.sh
#!/bin/bash
read -p "请输⼊要测试的⽹址:" web # read:命令行内输入web的变量值
ping -c 3 $web &> /dev/null # ping -c 3,连接某个网站三次
if [ $? -eq 0 ];then # 如果ping命令执行成功,那么
echo "此时⽹络畅通!" # 输出“此时网络畅通”
else # 否则
echo "⽆法访问,请检查⽹址是否输⼊正确或检查相关的⽹络配置!" # 输出“无法访
问...”
fi # if语句的结尾
:wq
[root@localhost test]# sh ./ping.sh
请输⼊要测试的⽹址:www.baidu.com
此时⽹络畅通!
多重判断的 case 语句
[root@localhost test]# vim fscase.sh
#!/bin/bash
#使⽤case语句编写分数等级评定脚本
read -p "请输⼊您的分数(0-100):" fs
case $fs in
[0-9]|[0-5][0-9]) # 0到9或59以内的两位数
echo "$fs分,不及格!"
;;
6[0-9]) # 6开头的两位数,若$fs输入为0,则判定为60,即执行下面的echo命令
echo "$fs分,及格!"
;;
7[0-9]|8[0-5]) # 以7开头的两位数或以8开头的两位数
echo "$fs分,良好!"
;;
8[6-9]|9[0-9]|100) # 以8开头的两位数,第二位最少为6,也就是最小是86 | 以9
开头的两位数 | 100
echo "$fs分,优秀!"
;;
*) # 输入不在上述规则内的其他字符,则echo如下命令
echo "您输⼊的分数有误!"
esac
:wq
[root@localhost test]# sh ./fscase.sh
请输⼊您的分数(0-100):5
5分,不及格!
[root@localhost test]# sh ./fscase.sh
请输⼊您的分数(0-100):58
58分,不及格!
[root@localhost test]# sh ./fscase.sh
请输⼊您的分数(0-100):69
69分,及格!
[root@localhost test]# sh ./fscase.sh
请输⼊您的分数(0-100):70
70分,良好!
[root@localhost test]# sh ./fscase.sh
请输⼊您的分数(0-100):89
89分,优秀!
[root@localhost test]# sh ./fscase.sh
请输⼊您的分数(0-100):100
100分,优秀!
[root@localhost test]# sh ./fscase.sh
请输⼊您的分数(0-100):110
您输⼊的分数有误!

四、for 循环

for 变量名 in 取值列表(范围)
do
命令序列
done
检测某个网段的存活主机
[root@localhost test]# vim ping.sh
#!/bin/bash
for IP in $(echo 192.168.33.{100..120}) # 192.168.33网段的100到120的主机,在此
循环
do
ping -c 2 -i 0.1 $IP &> /dev/null
if [ $? -eq 0 ];then
echo "Host $IP is up."
fi
done
:wq
[root@localhost test]# bash ping.sh
Host 192.168.100.100 is up.
Host 192.168.100.101 is up.
五、while 循环
while 条件测试操作
do
命令序列
done
while for 区别
while 循环也有条件判断,当条件成立的时候,会循环执行。当条件不成立退出
if 判断当条件成立时,会执行一次,然后退出。当条件不成立时直接退出
批量添加用户

 

[root@localhost test]# vim useradd.sh # 批量创建⽤户脚本
#!/bin/bash
read -p "请输⼊创建⽤户的名称前缀:" QZ
read -p "请输⼊创建⽤户的个数:" NUM
read -p "请输⼊⽤户的初始密码:" PS
i=1
while [ $i -le $NUM ]
do
useradd $QZ$i
echo "$PS" |passwd --stdin $QZ$i &> /dev/null
chage -d 0 $QZ$i
let i++
done
:wq
[root@localhost test]# bash useradd.sh
请输⼊创建⽤户的名称前缀:admin
请输⼊创建⽤户的个数:5
请输⼊⽤户的初始密码:123456
[root@localhost test]# tail /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
yunjisuan:x:1000:1000:yunjisuan:/home/yunjisuan:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
nginx:x:975:974:Nginx web server:/var/lib/nginx:/sbin/nologin
admin1:x:1001:1001::/home/admin1:/bin/bash
admin2:x:1002:1002::/home/admin2:/bin/bash
admin3:x:1003:1003::/home/admin3:/bin/bash
admin4:x:1004:1004::/home/admin4:/bin/bash
admin5:x:1005:1005::/home/admin5:/bin/bash
[root@localhost test]# vim userdel.sh # 批量删除⽤户脚本
#!/bin/bash
read -p "请输⼊要删除⽤户的前缀:" QZ
read -p "请输⼊要删除⽤户的个数:" NUM
i=1
while [ $i -le $NUM ]
do
userdel -r $QZ$i
let i++
done
:wq
[root@localhost test]# bash userdel.sh
请输⼊要删除⽤户的前缀:admin
请输⼊要删除⽤户的个数:5
[root@localhost test]#

六、sed流式编辑器

sed 是文本处理工具,读取文本内容,根据指定条件进行处理,可实现
增删改查的功能。 sed 依赖于正则表达式。
-e 指定要执行的命令 ( 操作 ) ,只有一个编辑命令 ( 操作 ) 时可省略
-n 只输出处理后的行,读入时不显示,不对原文件进行修改
-i 直接修改源文件,不输出结果
p  打印(输出)
d  删除(整行)
s  替换(字符串匹配)
c  替换(整行)
r  读取指定文件(追加到行后)
a (append )追加到指定内容到行后
i (insert )追加指定内容到行前
w  另存为
n  表示读入下一行内容
H  复制到剪贴板
g  将剪贴板中的内容覆盖到指定行
G  将剪贴板中的内容追加到指定行后
  • 18
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值