shell 交互式赋值
read命令
read命令用来提示用户输入信息,从而实现简单的交互式过程
[root@ZHONG-LONG ~]# read kernel
12
[root@ZHONG-LONG ~]# echo $kernel
12
[root@ZHONG-LONG ~]# read a b c
1 2 3
[root@ZHONG-LONG ~]# echo $a $b $c
1 2 3
#-p提示信息
[root@ZHONG-LONG ~]# read -p “Please enter your password:” password
Please enter your password:123
[root@ZHONG-LONG ~]# read -p "Please enter your name ! " name
Please enter your name ! jack
[root@ZHONG-LONG ~]# echo $name
jack
实例1:身份验证
判断用户名是root 密码是123456 成功登陆;
否则提示账号或密码错误!
#user=root
read -p “Please enter your UserName :” name
echo “Your UserName is : $name”
if [ $name == root ]
then
read -p “Please enter your Password :” passwd
if [ $passwd == 123456 ]
then
echo “Good! Success!”
else
echo “Username or Password error!”
fi
fi
#输出
[root@ZHONG-LONG ~]# sh user.sh
Please enter your UserName :root
Your UserName is : root
Please enter your Password :123456
Good! Success!
[root@ZHONG-LONG ~]#
[root@ZHONG-LONG ~]#
[root@ZHONG-LONG ~]#
[root@ZHONG-LONG ~]# sh user.sh
Please enter your UserName :roo
Your UserName is : roo
[root@ZHONG-LONG ~]# sh user.sh
Please enter your UserName :root
Your UserName is : root
Please enter your Password :123
Username or Password error!
shell 条件测试语句
test
[ ]
1、文件测试
文件测试是指根据给定的路径名称,判断是文件还是目录,判断是具有读写执行的权限,
常用的选项如下
-d 测试是否为目录(Direcotory)或目录是否存在
-e 测试目录或文件是否存在(Exist)
-f 测试是否为文件(File)或文件是否存在
-r 测试当前用户是否有权限读取(Read)
-w 测试当前用户是否有权限写入(Write)
-x 测试当前用户是否有权限执行(eXcute)
/media/cdrom
[root@ZHONG-LONG ~]# [ -d /media/cdrom ]
[root@ZHONG-LONG ~]# echo $?
1
[root@ZHONG-LONG ~]# [ ! -d /media/cdrom ]
[root@ZHONG-LONG ~]# echo $?
0
[root@ZHONG-LONG ~]# [ ! -d /media/cdrom ] && mkdir -p /media/cdrom
[root@ZHONG-LONG ~]# ls /media/
cdrom
[root@ZHONG-LONG ~]# [ ! -d /media/cdrom/ ] && echo " File ok "
[root@ZHONG-LONG ~]# [ -d /media/cdrom/ ] && echo " File ok "
File ok
[root@ZHONG-LONG ~]# test -d /media/cdrom/
[root@ZHONG-LONG ~]# echo $?
0
#多条件判断
#逻辑测试
逻辑测试指得是判断两个或多个条件之间的依赖关系,当系统取决于多个条件时,根据这些条件或其中一个条件成立等情况的过程
常用的逻辑测试
&&:逻辑与,"并且而且"的意思 满足两个条件
||:逻辑或,"或者"的意思 满足两个条件中的一个
!:逻辑否
[root@ZHONG-LONG scripts]# ll first.sh
-rwxr-xr-x 1 root root 79 Aug 16 22:16 first.sh
[root@ZHONG-LONG scripts]# test -x first.sh
[root@ZHONG-LONG scripts]# echo $?
0
[root@ZHONG-LONG scripts]# A=10
[root@ZHONG-LONG scripts]# [ $A -gt 1 ] && echo yes
yes
[root@ZHONG-LONG scripts]# [ $A -gt 1 ] || echo yes
[root@ZHONG-LONG scripts]# [ ! $A -gt 1 ] || echo yes
yes
#数值比较
#数值的比较值得是根据给定的两个整数判断第一个数值与第二个数值的关系
-eq:等于(Equal) Eq
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greateror Equal)
格式[ 数值1 操作符 数值2 ]
#判断当前登录的用户数
[root@ZHONG-LONG scripts]# users=$(who |wc -l)
[root@ZHONG-LONG scripts]# echo $users
1
[root@ZHONG-LONG scripts]# [ $users -gt 5 ] && echo $users
[root@ZHONG-LONG scripts]# [ ! $users -gt 5 ] && echo $users
1
[root@ZHONG-LONG scripts]# [ $users -gt 1 ] && echo $users
[root@ZHONG-LONG scripts]# [ $users -eq 1 ] && echo $users
1
[root@ZHONG-LONG scripts]# [ $users -lt 1 ] && echo $users
[root@ZHONG-LONG scripts]# [ $users -lt 5 ] && echo $users
1
#字符串比较
字符串比较通常用来检查用户输入、系统环境是否满足条件、在提供交互式操作的shell脚本中也可以判断用户输入位置参数是否符合要求,字符串的常用操作如下
= 字符串内容相同
!= 字符串内容不同
-z 字符串内容为空
实例1:判断当前的字符集
#!/bin/bash
echo $LANG
[ KaTeX parse error: Expected 'EOF', got '&' at position 17: …ANG != en_US ] &̲& echo "LING"
[ KaTeX parse error: Expected 'EOF', got '&' at position 16: LANG = en_US ] &̲& echo "LING"
#输出
[root@ZHONG-LONG scripts]# sh -x lang.sh
echo en_US.UTF-8
en_US.UTF-8
‘[’ en_US.UTF-8 ‘!=’ en_US ‘]’
echo ‘’
‘[’ en_US.UTF-8 = en_US ‘]’
[root@ZHONG-LONG scripts]# sh lang.sh
en_US.UTF-8
[root@ZHONG-LONG scripts]# echo $LANG
en_US.UTF-8
实例2:判断字符串是否为空
[root@ZHONG-LONG scripts]# a=
[root@ZHONG-LONG scripts]# echo $a
[root@ZHONG-LONG scripts]# [ $a -z ] && echo "ok ! "
ok !
[root@ZHONG-LONG scripts]# [ ! $a -z ] && echo "ok ! "
[root@ZHONG-LONG scripts]# [ ! $a -z ] || echo "ok ! "
ok !
shell 中的IF语句
if语句是循环语句中的一种又称为控制语句.
通过制定条件进行判断执行;
只有条件成立的时候才会执行相应的代码,否则不会进行任何操作
#单分支if语句
if 条件测试操作
then
命令序列
fi
单分支的结构非常简单,条件成立就执行then命令序列,条件不成立立即fi结束
实例1 判断文件是否存在
#!/bin/bash
#This is my first if scripts!
#/root/cmd
if [ ! -d /root/cmd ]
then
mkdir -p /root/cmd
fi
#输出
[root@ZHONG-LONG scripts]# sh if01.sh
[root@ZHONG-LONG ~]# ll -d /root/cmd/
drwxr-xr-x 2 root root 4096 Sep 2 15:52 /root/cmd/
实例2 系统判断
#/bin/bash
#This is my scripts!
SYS=uname
IPADDR=$(ifconfig eth0|grep “inet”|awk ‘{print $2}’)
KERNEL=uname -r
if [ $SYS == Linux ]
then
echo “Your system is : $SYS”
echo “Your IPADDR is : $IPADDR”
echo “Your KERNEL is : $KERNEL”
fi
总结:单分支语句功能有限,只能完成基本的系统操作
11.bash
11-Shell编程-双分支IF语句
双分支的选择结果,要求针对条件成立,条件不成立两种情况分别执行不同的操作
语法结构
if 条件测试操作
then(条件成立执行)
命令序列1
else(否则,条件不成立,则执行)
命令序列2
fi
首先通过if进行条件测试。如果条件成立则执行命令序列1,如果不成立则进行命令序列2,之后fi结束判断
实例1:测试主机存活
#/bin/bash
ping -c 3 -i 0.2 -w 3 $1 >/dev/null
if [ $? -eq 0 ]
then
echo "$1 is up ! "
else
echo "Targethost is down ! "
fi
#输出
[root@ZHONG-LONG ~]# sh if03.sh 127.0.0.1
127.0.0.1 is up !
扩展:ping
-c ping包的次数
-i ping包的间隔
-w 超时的时间间隔
实例2
#!/bin/bash
STR=98
read -p "Please enter your number ! " num
echo “You enter num is : $num”
if [ $num == $STR ]
then
echo “恭喜你猜中了”
else
echo “很遗憾回答错误”
fi
#输出
[root@ZHONG-LONG ~]# sh if04.sh
Please enter your number ! 20
You enter num is : 20
很遗憾回答错误
[root@ZHONG-LONG ~]# sh if04.sh
Please enter your number ! 98
You enter num is : 98
恭喜你猜中了
12-Shell编程-多分支if语句
由于if语句可以根据测试结果的成立,不成立分别执行,所以可以嵌套使用,进行多次判断.
多分支语法格式
if 条件测试操作1
then
命令序列1
elif 条件测试2
then
命令序列2
else
命令序列3
fi
首先判断条件测试操作1的结果,
如果条件1成立,则执行then命令序列1,然后跳转至fi结束判断
如果条件1不成立,则继续判断条件测试2的结果
如果条件序列2成立则执行命令序列2,然后跳至fi结束判断
如果所有的条件都不满足则执行else后面的命令序列3直到遇到fi结束
实例
#!/bin/bash
read -p “Please enter a num (0-100) :” NUM
echo “Your enter num is : $NUM”
if [ $NUM -gt 85 ] && [ $NUM -le 100 ]
then
echo " 非常好 ! "
elif [ $SUM -le 85 ] && [ $NUM -gt 60 ]
then
echo " 好 ! "
else
echo " 继续努力 "
fi
[root@ZHONG-LONG ~]# sh gradedive.sh
Please enter a num (0-100) :86
Your enter num is : 86
非常好 !
[root@ZHONG-LONG ~]# sh gradedive.sh
Please enter a num (0-100) :77
Your enter num is : 77
gradedive.sh: line 10: [: -le: unary operator expected
继续努力
[root@ZHONG-LONG ~]# echo $?
0
此处小于85时,会有一个错误提示
#实战部分
编写脚本程序应用于监视系统服务httpd的运行状态。
要求如下:
当服务状态失败时在"/var/log/httpderr.log"文件中记入日志信息
自动将状态失败的httpd服务重新启动。若重启httpd服务失败,则尝试重新启动服务器主机
#安装htttpd服务
#能上网
[root@ZHONG-LONG ~]# ps -ef |grep httpd
apache 1252 2557 0 03:18 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 1253 2557 0 03:18 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 1254 2557 0 03:18 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 1255 2557 0 03:18 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 1256 2557 0 03:18 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 1295 2557 0 03:20 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 2468 1869 0 17:10 pts/0 00:00:00 grep --color=auto httpd
root 2557 1 0 Aug15 ? 00:01:18 /usr/sbin/httpd -DFOREGROUND
[root@ZHONG-LONG ~]# rpm -q httpd
httpd-2.4.6-80.el7.centos.1.x86_64
[root@ZHONG-LONG ~]# ping -c 4 www.baidu.com
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=52 time=6.60 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=52 time=6.67 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=3 ttl=52 time=6.65 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=4 ttl=52 time=6.66 ms
— www.a.shifen.com ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 6.605/6.650/6.673/0.103 ms
#术语
httpd:网站服务 Apache,Nginx,tomcat;
端口:tcp 80
服务名称:httpd
#centos7 查看服务状态
[root@ZHONG-LONG ~]# systemctl status httpd #状态
[root@ZHONG-LONG ~]# systemctl start httpd #启动
[root@ZHONG-LONG ~]# systemctl stop httpd #停止
[root@ZHONG-LONG ~]# systemctl restart httpd #重启
#编写脚本
#!/bin/bash
#This is a httpd status script!
systemctl status httpd >>/dev/null
if [ $? -eq 0 ]
then
echo “Httpd server is running”
elif [ $? -ne 0 ]
then
echo “Httpd server running fail. Try to restart” >>/var/log/httperr.log
read -p " do restart service(YES/NO) ? " DO
echo "Your input is $DO "
if [ $DO == YES ]
then
echo " restarting httpd service "
systemctl restart httpd
elif [ $DO == NO ]
then
echo " script stop ! "
else
echo “please enter YES/NO”
fi
else
echo “Please restat your moniche”
fi
#输出
[root@ZHONG-LONG ~]# sh http.sh
Httpd server is running
[root@ZHONG-LONG ~]# systemctl stop httpd
[root@ZHONG-LONG ~]# sh http.sh
do restart service(YES/NO) ? YES
Your input is YES
restarting httpd service
[root@ZHONG-LONG ~]# sh http.sh
Httpd server is running
Shell 基础命令
(系统管理与维护)
命令{
ls 命令{
查看文件目录
选项:-a 显示隐藏文件; -d 查看目录属性 -l 文件的详细信息
实例:{
[root@ZHONG-LONG ~]# cd /home/
[root@ZHONG-LONG home]# ls
zhonglong
[root@ZHONG-LONG home]# touch a.txt
[root@ZHONG-LONG home]# ls
a.txt zhonglong
[root@ZHONG-LONG home]# touch .a.txt
[root@ZHONG-LONG home]# ls -a
. .. .a.txt a.txt zhonglong
[root@ZHONG-LONG home]# ls
a.txt zhonglong
[root@ZHONG-LONG home]# ls -d /root/
/root/
[root@ZHONG-LONG home]# ls -l /root/
total 43144
-rw-r--r-- 1 root root 783 Aug 15 18:00 clear_messageslog.sh
drwxr-xr-x 2 root root 4096 Sep 2 15:52 cmd
drwxr-xr-x 3 root root 4096 Aug 15 10:14 faqi
-rw-r--r-- 1 root root 254 Sep 2 17:05 gradedive.sh
-rw-r--r-- 1 root root 541 Sep 2 18:01 http.sh
-rw-r--r-- 1 root root 253 Sep 2 15:58 if02.sh
-rw-r--r-- 1 root root 135 Sep 2 16:16 if03.sh
-rw-r--r-- 1 root root 196 Sep 2 16:24 if04.sh
-rw-r--r-- 1 root root 33278710 Jul 15 2015 mysql-5.6.26.tar.gz
-rw-r--r-- 1 root root 10854400 Aug 29 16:53 rabbitmq-server-generic-unix-3.7.7.tar
drwxr-xr-x 3 root root 4096 Sep 2 15:52 scripts
drwxr-xr-x 2 root root 4096 Sep 2 12:21 shell
-rw-r--r-- 1 root root 325 Sep 2 14:37 user.sh
}
}
pwd 查看当前路径
cd
date {
作用:显示或者设置当前的时间
选项:"+%Y-%m-%d %H:%M:%S" -s 设置时间
实例{
[root@ZHONG-LONG home]# echo "date +%F"
date +%F
[root@ZHONG-LONG home]# date +%F
2018-09-02
[root@ZHONG-LONG home]# date +%Y-%m-%d
2018-09-02
[root@ZHONG-LONG home]# date "+%Y-%m-%d"
2018-09-02
[root@ZHONG-LONG home]# date "+%Y-%m-%d %H%M"
2018-09-02 1833
[root@ZHONG-LONG home]# date "+%Y-%m-%d %H:%M"
2018-09-02 18:33
[root@ZHONG-LONG home]# date "+%Y-%m-%d %H:%M:%s"
2018-09-02 18:34:1535884461
[root@ZHONG-LONG home]# date "+%Y-%m-%d %H:%M:%S"
2018-09-02 18:34:32
}
passwd{
作用:修改用户的密码
实例:{
[root@ZHONG-LONG home]# passwd zhonglong
Changing password for user zhonglong.
New password:
BAD PASSWORD: The password contains the user name in some form
Retype new password:
passwd: all authentication tokens updated successfully.
}
su{
作用:切换用户
格式:su 用户名, su - zhonglong 连同环境变量切换到zhonglong用户
}
clear{
作用:清屏
}
man{
作用:查看命令的信息
}
}
shell 基础命令
who{
作用:查看当前的登录到系统的用户
实例:{
root pts/0 2018-09-02 11:46 (163.125.118.113)
名称:当前的用户
终端:当前所在的终端
时间:登录的时间
主机名:主机名或者IP地址
[root@ZHONG-LONG home]# who -a #列出所有信息
system boot 2018-08-06 06:26
LOGIN ttyS0 2018-08-05 22:26 505 id=tyS0
LOGIN tty1 2018-08-05 22:37 10475 id=tty1
run-level 3 2018-08-05 22:26
root + pts/0 2018-09-02 11:46 . 1869 (163.125.118.113)
zhonglong + pts/1 2018-09-02 18:54 . 2731 (163.125.118.113)
pts/2 2018-08-22 15:30 15568 id=ts/2 term=0 exit=0
pts/3 2018-08-22 17:52 15620 id=ts/3 term=0 exit=0
[root@ZHONG-LONG home]# who -b #列出系统最近启动的时间
system boot 2018-08-06 06:26
[root@ZHONG-LONG home]# who -l #列出所有登录的终端信息
LOGIN ttyS0 2018-08-05 22:26 505 id=tyS0
LOGIN tty1 2018-08-05 22:37 10475 id=tty1
[root@ZHONG-LONG home]# who -m #显示关于终端的当前信息
root pts/0 2018-09-02 11:46 (163.125.118.113)
[root@ZHONG-LONG home]# who am i #与who -m类似
root pts/0 2018-09-02 11:46 (163.125.118.113)
[root@ZHONG-LONG home]# who -r #显示当前系统运行级别
run-level 3 2018-08-05 22:26
}
w{
作用:显示登录系统到系统的用户
选项:-h不显示输出信息的标题; -l 用长格式输出; -s 短格式输出; -V显示版本
实例:{
[root@ZHONG-LONG home]# w
19:00:55 up 27 days, 20:34, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 163.125.118.113 11:46 7.00s 0.72s 0.00s w
zhonglon pts/1 163.125.118.113 18:54 6:29 0.00s 0.00s -bash
#注释
系统时间 系统运行总时间 当前登录的用户 系统负载 1分钟 5分钟 15分钟
}
uname{
作用:显示系统的相关信息
选项:
-n 显示主机名称
-a 显示系统的全部信息
-m 显示系统CPU信息,类型32/64
-s 显示操作系统类型
-r 显示内核信息
实例:{
[root@ZHONG-LONG home]# uname
Linux
[root@ZHONG-LONG home]# uname -r
3.10.0-693.2.2.el7.x86_64
[root@ZHONG-LONG home]# uname -a
Linux ZHONG-LONG 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@ZHONG-LONG home]# uname -m
x86_64
[root@ZHONG-LONG home]# uname -n
ZHONG-LONG
[root@ZHONG-LONG home]# uname -s
Linux
}
uptime{
作用:输出系统的任务队列信息;
实例:{
[root@ZHONG-LONG home]# uptime
19:09:14 up 27 days, 20:42, 2 users, load average: 0.01, 0.02, 0.05
#注释
系统时间 系统运行总时间 当前登录的用户 系统负载 1分钟 5分钟 15分钟
}
last{
作用:所有登入系统的用户相关信息;/var/log/wtmp
选项:
-a 把从何处登录的主机和用户名显示在最后一行;
-R 不输出主机名和IP地址
-x 显示四通开关机等信息
-n 列出名单的显示列数
-d 将显示的IP地址转换成主机名称
实例:{
[root@ZHONG-LONG home]# last -a
zhonglon pts/2 Sun Sep 2 19:16 still logged in 163.125.118.113
wtmp begins Sun Sep 2 19:16:49 2018
[root@ZHONG-LONG home]# last -R
zhonglon pts/2 Sun Sep 2 19:16 still logged in
wtmp begins Sun Sep 2 19:16:49 2018
[root@ZHONG-LONG home]# last -x
zhonglon pts/2 163.125.118.113 Sun Sep 2 19:16 still logged in
wtmp begins Sun Sep 2 19:16:49 2018
[root@ZHONG-LONG home]# last -2
zhonglon pts/2 163.125.118.113 Sun Sep 2 19:16 still logged in
wtmp begins Sun Sep 2 19:16:49 2018
[root@ZHONG-LONG home]# last -1
zhonglon pts/2 163.125.118.113 Sun Sep 2 19:16 still logged in
wtmp begins Sun Sep 2 19:16:49 2018
[root@ZHONG-LONG home]# last -d
zhonglon pts/2 163.125.118.113 Sun Sep 2 19:16 still logged in
wtmp begins Sun Sep 2 19:16:49 2018
}
dmesg{
作用:显示系统开机信息
}
free{
作用:显示内存的信息
选项:
-b 以字节为单位显示内存的使用量
-m 以M为单位显示内存的使用量
-g 以g为单位显示内存的使用量
实例:{
[root@ZHONG-LONG home]# free
total used free shared buff/cache available
Mem: 3881692 199336 837712 480 2844644 3409152
Swap: 0 0 0
[root@ZHONG-LONG home]# free -m
total used free shared buff/cache available
Mem: 3790 194 817 0 2777 3329
Swap: 0 0 0
[root@ZHONG-LONG home]# free -g
total used free shared buff/cache available
Mem: 3 0 0 0 2 3
Swap: 0 0 0
[root@ZHONG-LONG home]# free -b
total used free shared buff/cache available
Mem: 3974852608 204083200 857833472 491520 2912935936 3491008512
Swap: 0 0 0
}
ps{
作用:查询进程信息
选项:
-a 显示所有用户的进程
-x 显示所用系统中运行的程序
-u 显示使用者的时间和名称
-f 显示详细的程序执行路径信息
-c 只显示进程名称
实例:{
[root@ZHONG-LONG home]# ps aux | grep httpd
[root@ZHONG-LONG home]# ps aux | grep httpd |grep -v grep
}
top{
作用:动态查看进程
选项:
-d 指定屏幕刷新时间间隔
-i 不显示闲置或者是僵尸进程
-c 显示进程的整个路径
-s 在安全模式运行
-b 分屏显示输出
-n 输出信息的更新次数
实例:{
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
31441 root 20 0 130688 11204 9160 S 0.7 0.3 10:43.91 AliYunDun
1 root 20 0 125324 3812 2528 S 0.0 0.1 1:22.48 systemd
#注释
#PID 指得是进程的进程号
#USER 进程的所有者
#PR 进程的优先级
#NI nice值。负值表示高优先级,正值表示低优先级
#VIRT 进程使用的虚拟内存总量,单位kb,VIRT=SWAP+RES
#RES 进程使用的、未被换出的物理内存大小,单位kb,RES=CODE+DATA
#SHR 共享内存大小,单位kb
#S 进程状态,D=睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
#%CPU 上次更新到现在的CPU时间占用百分比
#%MEM 进程使用的物理内存百分比
#TIME+ 进程使用的CPU时间总计,单位1/100秒
#COMMAND 进程名称(命令名/命令行)
}
快捷键:{
i 过滤闲置和僵尸进程
m 显示内存信息
M 以内存排序
P 以CPU占用排序
1 显示CUP核数
}
}