一、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 将剪贴板中的内容追加到指定行后