shell编程

Shell入门

什么是shell?

Shell其实是一个命令解释器,作用是解释执行用户输入的命令以及程序等,用户每输入一条命令,Shell给予解释执行一条。这种键盘一输入命令,就可以立即得到回应的对话方式,称为交互模式。
Shell存在于操作系统的最外层,负责与用户直接对话。处理用户的输入,并将操作系统执行结果返回给用户。在用户登陆到操作系统之后的所有操作均由Shell解释执行。Shell在操作系统中所处的位置如下

image

什么是shell脚本?

简言之,如果shell命令通过写入到一个程序文件并执行的时候,此程序我们就称之为shell脚本。但是在生产环境中的Shell脚本不仅仅是这么简单,而是将一些命令、变量以及流程控制语句有机结合并生成的功能完善的强大的应用程序。

什么时候使用shell脚本?

Linux批量管理
自动化完成系统优化
自动化安装Linux操作系统(kickstart和cobbler)
测试工具和内容自动化
邮件自动发送
服务自动重启
代码上线
定时备份和定时启停服务
Linux系统监控、服务监控、端口监控、IP黑名单监控、流量监控(脚本+zabbix)
服务的日志切割、存储备份、日志分析等等

如何学好shell脚本?

基础变量、条件表达式、流程判断、if、for循环、while循环、case语句、循环控制
从简单的判断和循环开始写
阅读、模仿、尝试从零开始写
写注释,将任务分解成一个个小任务,类似于打游戏闯关
找一本合适的教材,或者自己认真记笔记
多练习-思考-练习-思考,循环往复

解释型语言和编译型语言

编译型语言:

指用专用的编译器,针对特定的操作平台(操作系统)将某种高级语言源代码一次性翻译成可被硬件平台直接运行的二进制机器码,这个过程叫做编译。
编译好的可执行文件(.exe),可在相对应的平台运行(移植性差,但是效率高)。
C\C++.....

解释型语言:

用专门解释器对源程序逐行解释成特定平台的机器码并立即执行的语言,相当于把编译型语言的编译执行过程混合在一起同时完成的。
编译型语言执行效率较低,切不能脱离解释器运行。但是跨平台比较容易,只需提供相应的解释器
shell\python
注:Java属于特殊的。既可以说成是解释型语言,又可以说成是编译型语言

shell是命令解释器
shell脚本是由命令组合成的一个可执行的文件
编译型语言和解释型语言

shell脚本建立和执行

解释器类型

bash是centos中的默认解释器
sh

脚本定义

脚本开头

# !/bin/bash

父shell和子shell

脚本嵌套
父shell中的环境变量,在子shell中可以看到
而子shell中的变量,在父shell中看不到

shell执行方式

sh & bash,最常用的使用方式
cat *.sh | bash,适用于执行多个脚本
sh < oldboy.sh,了解一下,输入重定向
/root/oldboy.sh,需要执行权限
. oldboy.sh
source oldboy.sh

shell开发习惯

 脚本存放在固定目录
 开头加脚本解释器信息
 附带作者和版权信息
 脚本中尽量不用中文
 脚本扩展名用.sh
 成对的符号一次性书写完成
 注意缩进
 养成写注释的良好习惯

总结

脚本放在指定目录
创建脚本,后缀是.sh
在第一行顶格添加命令解释器的声明#!/bin/bash
添加作者时间和版权信息
养成良好习惯,添加注释
Centos7默认解释器是/bin/bash
退出当前shell的命令是:exit
有一个小问题:在使用history的时候,加入脚本中,执行什么也不会输出。
在脚本中加入set -o history即可解决,但是默认显示的是这个脚本里的历史命令。但是
如果还想显示脚本外的历史记录,可以使用source 执行脚本。

变量基础

定义变量

值可变的量,称为变量
变量名=变量值,常说的变量,一般是变量名
字母数字下划线,不能是数字开头

环境变量和普通变量

环境变量(全局变量)

 可在创建他们的shell以及派生出来的任意子shell中使用
 环境变量包括内置的环境变量和自定义的环境变量,且通常为大写。
 环境变量的定义方式:

declare -x 变量名=value
export 变量名=value

 环境变量有四个文件,他们的执行顺序如下图所示:

image

 登陆shell会加载所有的环境变量
 非登陆shell可能会加载~/.bashrc或者/etc/bashrc(上图非绿色部分),然而有些定时任务以上两个根本不会加载,所以需要手动指定,建议在定义变量时定义到/etc/bashrc
 可以在环境变量文件中定义普通变量

普通变量

 普通变量只有在当前shell下才能使用
 定义方式
# 适用于一般场景,不适用于带有空格等字符
变量名=value
# 所见即所得的定义方式
变量名=’value’
# 解析双引号之内的变量
变量名=”value

 注意点:(举例说明)

  1. 变量如果后面有内容,一定要把变量括{}起来
  2. 希望变量内容原样输出则加单引号
  3. 希望获取变量中的命令执行结果用``或者$()

1、定义环境变量的方式:
export 变量名=变量值
2、定义普通变量的方式:
变量名=变量值
3、定义变量的三种方式

# 适用于一般场景,不适用于带有空格等字符
[export] 变量名=value
# 所见即所得的定义方式
[export] 变量名=’value’
# 解析双引号之内的变量
[export] 变量名=”value”
4、环境变量文件的加载顺序
/etc/profile ===> ~/.bash_profile ===> ~/.bashrc ===> /etc/bashrc
5、非登录式(ssh)的shell只加载后两个

临时变量和永久变量(了解)

如果按照变量的生存周期来划分的话,Linux变量可以分为两类:
 永久变量:需要修改变量配置文件,使得变量永久生效
 临时变量,使用export命令或者直接在当前shell中赋值的变量

shell特殊变量

参数特殊变量

特殊变量 作用说明
0获取当前执行shell脚本文件名,如果执行脚本带路径,则包括完整路径
n获取当前执行脚本的第n个参数值,若n>9,则用大括号包裹,如10#传递到脚本的参数个数
*以一个单字符串显示所有向脚本传递的参数@与$*相同,但是使用时加引号,并在每个引号中返回每个参数
n 获取当前执行shell脚本的第n个参数值,若n>9,则用大括号包裹,如10#
传递到脚本的参数个数
*以一个单字符串显示所有向脚本传递的参数@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。

进程特殊变量

特殊变量 作用说明
?显示最后命令的特殊状态,0表示没有错误,非0表示有错误。此变量最常用的$$显示脚本
! 后台运行的最后一个进程的ID号,此变量不常用,了解即可
$_ 之前运行脚本的最后一个参数,此变量最不常用,了解即可

shell变量子串

表达式 作用说明
{param} 返回变量param内容
{#param} 返回变量param内容的字符长度,也适合特殊变量,此表达式最常用
{param:offset} 在变量param中,从位置offset之后开始提取子串到结尾
{param:offset:length} 在变量param中,从位置offset之后开始提取长度为length的子串
{param#word} 在变量param开头删除最短匹配的word子串
{param##word} 在变量param开头删除最长匹配的word子串
{param%word} 在变量param结尾删除最短匹配的word子串
{param%%word} 在变量param结尾删除最长匹配的word子串
{param/pattern/string} 将变量param中符合pattern的第一个内容用string取代
{param//pattern/string} 将变量param中符合pattern的所有内容用string取代

总结:获取变量字符串长度的五种方法:

[root@shell ~]# oldboy="www.oldboy.com"
[root@shell ~]# echo ${#oldboy}
14
[root@shell ~]# echo ${oldboy} |wc -L
14
[root@shell ~]# expr length $oldboy
14
[root@shell ~]# echo ${oldboy}|awk '{print length}'
14
[root@shell ~]# echo ${oldboy}|awk '{print length($0)}'
14

练习:

1、 请使用shell脚本打印下面语句中字符数不小于6的单词
I am teacher oldchang and I like eating and sleeping

for n in $*                                  
do
    [ ${#n} -ge 6 ] && echo $n
done

2、 写出shell脚本,通过传参的方式,传入以下内容,并打印下面语句中字符数不小于6的单词
I am teacher oldchang and I like eating and sleeping

read -p '请输入你要处理的字符串: ' n
for n in $n
do
    if [ ${#n} -ge 6 ];then                
        echo $n
    fi
done

变量传参

脚本变量传参的三种方式:
 直接赋值

[oldchang@oldboy-node101 ~]$ cat 1.sh 
IP=127.0.0.1
echo $IP
[oldchang@oldboy-node101 ~]$ sh 1.sh 
127.0.0.1

 传参方式

[oldchang@oldboy-node101 ~]$ cat 1.sh 
IP=$1
echo $IP
[oldchang@oldboy-node101 ~]$ sh 1.sh 127.0.0.1
127.0.0.1

 read方式

[oldchang@oldboy-node101 ~]$ cat 1.sh 
read -p "请输入一个参数: " IP
echo $IP
[oldchang@oldboy-node101 ~]$ sh 1.sh 
请输入一个参数: 127.0.0.1
127.0.0.1

运算符与运算命令

image
image
image
[root@shell scripts]# a=8
[root@shell scripts]# echo $((a%6))
2
[root@shell scripts]# echo $a
8
[root@shell scripts]# echo $((a%=6))
2
[root@shell scripts]# echo $a
2

练习取值

[root@oldboyedu ~]# echo 1+1 | bc
2
[root@oldboyedu ~]# echo 3.3*8.7 | bc
28.7
[root@oldboyedu ~]# echo "scale=4;3.3*8.7" | bc
28.71
[root@oldboyedu ~]# echo "scale=4;3.33*8.7" | bc
28.971
[root@oldboyedu ~]# echo "scale=4;3.333*8.7" | bc
28.9971
[root@oldboyedu ~]# echo "scale=4;3.3333*8.7" | bc
28.9997
[root@oldboyedu ~]# echo "scale=10;3.3333*8.7" | bc
28.99971
[root@oldboyedu ~]# echo 1 2 | awk '{print $1}'
1
[root@oldboyedu ~]# echo 1 2 | awk '{print $1+$2}'
3
[root@oldboyedu ~]# echo 3.4 2 | awk '{print $1+$2}'
5.4
[root@oldboyedu ~]# echo 3.4 2.444444 | awk '{print $1+$2}'
5.84444
[root@oldboyedu ~]# let a=1+1
[root@oldboyedu ~]# let a=1.1+1
-bash: let: a=1.1+1: syntax error: invalid arithmetic operator (error token is ".1+1")
[root@oldboyedu ~]# echo $?
1
[root@oldboyedu ~]# expr 1 + 1
2
[root@oldboyedu ~]# echo $?
0
[root@oldboyedu ~]# expr 1.1 + 1
expr: non-integer argument
[root@oldboyedu ~]# echo $?
2
[root@oldboyedu ~]# echo 3/2 | bc
1
[root@oldboyedu ~]# echo $((2**3))
8
[root@oldboyedu ~]# let a=2**3
[root@oldboyedu ~]# echo $a
8
[root@oldboyedu ~]# let b=2**3
[root@oldboyedu ~]# echo $b
8
[root@oldboyedu ~]# expr 2 ** 3
expr: syntax error
[root@oldboyedu ~]# expr 2 * * 3
expr: syntax error
[root@oldboyedu ~]# expr 2 \** 3
expr: syntax error
[root@oldboyedu ~]# expr 2 \*\* 3
expr: syntax error
[root@oldboyedu ~]# expr "2 ** 3"
2 ** 3
[root@oldboyedu ~]# expr 2 "**" 3
expr: syntax error
[root@oldboyedu ~]# expr 2 ^ 3
expr: syntax error
[root@oldboyedu ~]# expr 2 \^ 3
expr: syntax error
[root@oldboyedu ~]# echo $[2**3]
8
[root@oldboyedu ~]# declare -i c=2**3
[root@oldboyedu ~]# echo $c
8
[root@oldboyedu ~]# echo 2**3 | bc 
(standard_in) 1: syntax error
[root@oldboyedu ~]# echo 2^3 | bc 
8
[root@oldboyedu ~]# a=1
[root@oldboyedu ~]# echo a++
a++
[root@oldboyedu ~]# echo $((a++))
1
[root@oldboyedu ~]# echo $((a++))
2
[root@oldboyedu ~]# echo $((a++))
3
[root@oldboyedu ~]# echo $((a++))
4
[root@oldboyedu ~]# a=1
[root@oldboyedu ~]# echo $((++a))
2
[root@oldboyedu ~]# echo $((++a))
3
[root@oldboyedu ~]# echo $((++a))
4
[root@oldboyedu ~]# echo $((++a))
5
[root@oldboyedu ~]# 
[root@oldboyedu ~]# a=1
[root@oldboyedu ~]# b=1
[root@oldboyedu ~]# x=a++
[root@oldboyedu ~]# y=++b
[root@oldboyedu ~]# 
[root@oldboyedu ~]# echo a
a
[root@oldboyedu ~]# echo $a
1
[root@oldboyedu ~]# echo $x
a++
[root@oldboyedu ~]# x=$((a++))
[root@oldboyedu ~]# y=$((++b))
[root@oldboyedu ~]# echo $a
2
[root@oldboyedu ~]# a=1
[root@oldboyedu ~]# b=1
[root@oldboyedu ~]# x=$((a++))
[root@oldboyedu ~]# y=$((++b))
[root@oldboyedu ~]# echo $a
2
[root@oldboyedu ~]# echo $x
1
[root@oldboyedu ~]# echo $b
2
[root@oldboyedu ~]# echo $y
2
[root@oldboyedu ~]# 8%5
-bash: 8%5: command not found
[root@oldboyedu ~]# expr 8 % 5
3
[root@oldboyedu ~]# a=8
[root@oldboyedu ~]# echo $((a%=5))
3
[root@oldboyedu ~]# echo $a
3
[root@oldboyedu ~]# echo $((a=a%5))
3


使用脚本传参的方式实现整数的加、减、乘、除、取余、幂运算

x=$1
y=$2

echo 1.利用'$(())'计算
echo 加:$1\+$2="$(($x+$y))"
echo 减:$1\-$2="$(($x-$y))"
echo 乘:$1\*$2="$(($x*$y))"
echo 除:$1\/$2="$(($x/$y))"
echo 幂:$1\**$2="$(($x**$y))"
echo 余:$1\%$2="$(($x%$y))"  

echo 2.利用awk计算
echo 加:$1+$2=`awk -vx=$x -vy=$y "BEGIN{print x+y}"`
echo 减:$1+$2=`awk -vx=$x -vy=$y "BEGIN{print x-y}"`
echo 乘:$1+$2=`awk -vx=$x -vy=$y "BEGIN{print x*y}"`
echo 除:$1+$2=`awk -vx=$x -vy=$y "BEGIN{print x/y}"`
echo 幂:$1+$2=`awk -vx=$x -vy=$y "BEGIN{print x**y}"`
echo 余:$1+$2=`awk -vx=$x -vy=$y "BEGIN{print x%y}"`
[root@shell scripts]# sh bc03.sh 2 6
1.利用$(())计算
加:2+6=8
减:2-6=-4
乘:2*6=12
除:2/6=0
幂:2**6=64
余:2%6=2
2.利用awk计算
加:2+6=8
减:2+6=-4
乘:2+6=12
除:2+6=0.333333
幂:2+6=64

[root@shell scripts]# cat bc02.sh 
#!/bin/bash
##############################################################
# File Name: bc03.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
x=$1
y=$2
echo="echo $1 $2"

echo 1.利用'$(())'计算
echo 加:$1\+$2="$(($x+$y))"
echo 减:$1\-$2="$(($x-$y))"
echo 乘:$1\*$2="$(($x*$y))"
echo 除:$1\/$2="$(($x/$y))"
echo 幂:$1\**$2="$(($x**$y))"
echo 余:$1\%$2="$(($x%$y))"  
echo '###################'
echo 2.利用awk计算
echo 加:$1+$2=`$echo|awk -vx=$x -vy=$y "BEGIN{print x+y}"`
echo 减:$1+$2=`$echo|awk -vx=$x -vy=$y "BEGIN{print x-y}"`
echo 乘:$1+$2=`$echo|awk -vx=$x -vy=$y "BEGIN{print x*y}"`
echo 除:$1+$2=`$echo|awk -vx=$x -vy=$y "BEGIN{print x/y}"`
echo 幂:$1+$2=`$echo|awk -vx=$x -vy=$y "BEGIN{print x**y}"`
echo 余:$1+$2=`$echo|awk -vx=$x -vy=$y "BEGIN{print x%y}"`
[root@shell scripts]# sh bc02.sh 6 3
1.利用$(())计算
加:6+3=9
减:6-3=3
乘:6*3=18
除:6/3=2
幂:6**3=216
余:6%3=0
###################
2.利用awk计算
加:6+3=9
减:6+3=3
乘:6+3=18
除:6+3=2
幂:6+3=216
余:6+3=0

表达式

条件测试表达式

image.png

image.png

image.png

image.png

文件测试表达式

image.png
[root@shell scripts]# test -L "/bin/sh" && echo ture||echo false
ture
[root@shell scripts]# test -s "/bin/sh" && echo ture||echo false
ture
[root@shell scripts]# test -d "/root" && echo ture||echo false
ture
[root@shell scripts]# test -x "ip.sh" && echo ture||echo false
ture    #文件可执行
[root@shell scripts]# test  -x "bc.sh" && echo ture||echo false
false   #文件不可执行
[root@shell scripts]# test ! -x "bc.sh" && echo ture||echo false
ture    #取反
[root@shell scripts]# test -s "bc.sh" && echo ture||echo false
ture    #文件存在非空
[root@shell scripts]# test ! -s "bc.sh" && echo ture||echo false
false   #取反

##############
#测试表达式
##############
[root@shell scripts]# test -f "/etc/hosts" && echo ture||echo false
ture
[root@shell scripts]# test -f "/etc/host" && echo ture||echo false
false
[root@shell scripts]# test -e "/etc/" && echo ture||echo false
ture
[root@shell scripts]# test -e "/etcetc/" && echo ture||echo false
false
[root@shell scripts]# test -d "/etc/hosts" && echo ture||echo false
false
[root@shell scripts]# test -d "/etc/" && echo ture||echo false
ture
[root@shell scripts]# test -L "/bin/sh" && echo ture||echo false
ture
[root@shell scripts]# test -L "/bin/ls" && echo ture||echo false
false
[root@shell scripts]# test -s "1.sh" && echo ture||echo false
ture
[root@shell scripts]# touch 2.sh
[root@shell scripts]# test -s "2.sh" && echo ture||echo false
false
############
#取反  
############
[root@shell scripts]# test ! -x "bc.sh" && echo ture||echo false
ture    #取反
[root@shell scripts]# test -s "bc.sh" && echo ture||echo false
ture    #文件存在非空
[root@shell scripts]# test ! -s "bc.sh" && echo ture||echo false
false   #取反

######################
#测试文件可读可写可执行
######################
[root@shell scripts]# su - oldboy   #切换到普通用户下
Last login: Thu May 16 17:01:19 CST 2019 on pts/0
[oldboy@shell ~]$ 
[oldboy@shell ~]$ test -r "test_01.sh" && echo ture||echo false
false
[oldboy@shell ~]$ test -w "test_01.sh" && echo ture||echo false
false
[oldboy@shell ~]$ test -x "test_01.sh" && echo ture||echo false
false

练习

image
image

采坑:

read读入方式定义的变量写为12了,与取参的12冲突了

[root@shell scripts]# cat testday2-1.sh 
#!/bin/bash
##############################################################
# File Name: testday2-1.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
read -p "请输入两个文件的路径: " a b

[ -f $a ]&& echo $a||{
    echo "第一个文件${a}不存在"
}

[ -f $b ]&& echo $b||{
    echo "第二个文件${b}不存在"
    exit
}
[root@shell scripts]# sh testday2-2.sh 
请输入两个文件的路径: xxx yyy
第一个文件xxx不存在
第二个文件yyy不存在
[root@shell scripts]# sh testday2-2.sh 
请输入两个文件的路径: bc.sh xxx
bc.sh
第二个文件xxx不存在
[root@shell scripts]# sh testday2-2.sh 
请输入两个文件的路径: xxx bc.sh
第一个文件xxx不存在
bc.sh

#2.0版 自动化
[root@shell scripts]# cat testday2-1-1.sh 
#!/bin/bash
read -p "请输入指定文件路径: " file   

for f in `echo $file`
do
    [ -f $f ]&&echo ${file}存在||{
    echo "${f}不存在"
}
done
[root@shell scripts]# sh 1.sh 
请输入指定文件路径: /server/scripts/1.sh /etc/hosts /etc/hostname
/server/scripts/1.sh /etc/hosts /etc/hostname存在
/server/scripts/1.sh /etc/hosts /etc/hostname存在
/server/scripts/1.sh /etc/hosts /etc/hostname存在


字符串测试表达式

image.png
#################
#判断变量是否存在
#################
[root@shell ~]# a=111
[root@shell ~]# b=1111
[root@shell ~]# test "$a" = "$b" && echo ture||echo false
false
[root@shell ~]# test "$a"="$b" && echo ture||echo false
ture
[root@shell ~]# echo $a
111
[root@shell ~]# echo $b
1111

[root@shell scripts]# test -n "$a" && echo ture||echo false
ture
[root@shell scripts]# test -z "$a" && echo ture||echo false
false
[root@shell scripts]# echo $a
123
[root@shell scripts]# unset a
[root@shell scripts]# test -n "$a" && echo ture||echo false
false
[root@shell scripts]# test -z "$a" && echo ture||echo false
ture

练习

image

1. 方法第一种

#第二种
[root@shell scripts]# cat testday2-3-2.sh
#!/bin/bash
# 判断传入参数的个数
[ "$#" != "2" ] && {
    echo "参数必须为2 Usage <$0 arg1 arg2>"
        exit 1
    }

    # 判断传参是否为整数
    expr $1 + $2 + 1 &> /dev/null
    [ "$?" != "0" ] && {
      echo "参数必须为整数"
        exit 2
    }  

    echo -n '相加: '; echo $(($1+$2))
    echo -n '相减: '; echo $(($1-$2))
    echo -n '相乘: '; echo $(($1*$2))
    echo -n '幂运算: '; echo $(($1**$2))
    # 判断除数是否为0
    [ "$2" = "0" ] && {
        echo "除数必须不能为0!!!"
            exit 3
        }
        echo -n '相除: '; echo $(($1/$2))
        echo -n '取余: '; echo $(($1%$2))
        [root@shell scripts]# sh testday2-3-2.sh 5 6.1
参数必须为整数
[root@shell scripts]# sh testday2-3-2.sh 5 6 7
参数必须为2 Usage <testday2-3-2.sh arg1 arg2>
[root@shell scripts]# sh testday2-3-2.sh 5 0
相加: 5
相减: 5
相乘: 0
幂运算: 1
除数必须不能为0!!!
[root@shell scripts]# sh testday2-3-2.sh 6 3
相加: 9
相减: 3
相乘: 18
幂运算: 216
相除: 2
取余: 0

2.方法第二种

#第三种 read读入默认2个参数

[root@shell scripts]# cat testday2-5.sh
#!/bin/bash
##############################################################
# File Name: testday2-5.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
read -p "请输入需要计算的内容:" m n

# 判断传参是否为整数
expr $m + $n + 1 &> /dev/null
[ "$?" != "0" ] && {
  echo "参数必须为整数"
    exit 2
}  

echo -n '相加: '; echo $(($m+$n))
echo -n '相减: '; echo $(($m-$n))
echo -n '相乘: '; echo $(($m*$n))
echo -n '幂运算: '; echo $(($m**$n))
# 判断除数是否为0
[ "$n" = "0" ] && {
    echo "除数必须不能为0!!!"
        exit 3
    }
    echo -n '相除: '; echo $(($m/$n))
    echo -n '取余: '; echo $(($m%$n))
[root@shell scripts]# sh testday2-5.sh
请输入需要计算的内容:5 6 7
参数必须为整数
[root@shell scripts]# sh testday2-5.sh
请输入需要计算的内容:5 6.1
参数必须为整数
[root@shell scripts]# sh testday2-5.sh
请输入需要计算的内容:5 0
相加: 5
相减: 5
相乘: 0
幂运算: 1
除数必须不能为0!!!
[root@shell scripts]# sh testday2-5.sh
请输入需要计算的内容:4 6
相加: 10
相减: -2
相乘: 24
幂运算: 4096
相除: 0
取余: 4

整数二元比较操作符

image.png

image.png
image

查看当前磁盘/当前状态,如果使用率超过10%,则触发报警发邮件

[root@shell scripts]# df -h|awk 'NR==2{print $(NF-1)}'
11%

[root@shell scripts]# df -h|awk 'NR==2{print $(NF-1)}'
11%
[root@shell scripts]# cat testday2-6.sh 
#!/bin/bash
##############################################################
# File Name: testday2-6.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
#查看当前磁盘/当前状态,如果使用率超过10%,则触发报警发邮件
use=`df -h|awk 'NR==2{print $(NF-1)}'`
userNum=${use/\%/}
[ $userNum -gt 10 ] && {
    echo "shell服务器磁盘使用率超过$use"
    echo "shell服务器磁盘使用率超过$use"|mail -s "磁盘不足" 245684979@qq.com
}
[root@shell scripts]# sh testday2-6.sh
shell服务器磁盘使用率超过11%

查看内存使用状况,如果占用超过10%,则触发报警

[root@shell day02]# cat testday2-7.sh 
#!/bin/bash
##############################################################
# File Name: testday2-7.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
#查看内存使用状况,如果占用超过10%,则触发报警
free=`free -h|awk 'NR==2{print $3/$2*100}'`
freeNum=${free/.*/}
[ $freeNum -gt 5 ] && {
    echo "shell服务器内存使用率超过${freeNum}%"
    echo "shell服务器内存使用率超过${freeNum}%"|mail -s "内存不足" 245684979@qq.com
}
[root@shell day02]# sh testday2-7.sh 
shell服务器内存使用率超过9%


逻辑操作符

image.png
#练习查看结果
# [ -f ip.sh -a 2 -lt 3 ]&& echo 0||echo 1
0
# [ -f ip.sh -a 2 -lt 3 -a 5 -gt 6 ]&& echo 0||echo 1
1
# [ -f ip.sh -o 2 -gt 3 ]&& echo 0||echo 1
0
# [ -f ip1.sh -o 2 -gt 3 ]&& echo 0||echo 1
1
# [ ! -f ip1.sh -o 2 -gt 3 ]&& echo 0||echo 1
0
# [ -f ip.sh ] && [ 2 -lt 3 ] && [ 2 -lt 3 ]&&echo 0||echo 1
0
# [ -f ip.sh ] && [ 2 -lt 3 ] && [ 2 -eq 3 ]&&echo 0||echo 1
1
# [ -f ip.sh ] && [ 2 -lt 3 ] && [ 2 -lt 3 ]&&echo 0||echo 1
0
# [[ -f ip.sh ]] && [[ 2 -lt 3 ]] && [[ 3 -gt 2 ]]&&echo 0||echo 1
0


练习

image

1、 输入或者通过命令传入一个字符或者数字,如果传入的数字等于1就打印1,如果等于2就打印2;如果不等于1也不等于2,就提示输入不对,然后退出程序。(两种比较方式任选其一:数字比较或字符串比较)

[root@shell day02]# cat testday2-10.sh 
#!/bin/bash
##############################################################
# File Name: testday2-10.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################

read -p "请输入一个字符或者数字:" a

[ $a -eq 1 ]&& {
    echo $a
    exit 0
}||
[ $a -eq 2 ]&& {
    echo $a 
    exit 0
}||
    echo 输入错误!
    exit 1
}

#[ $a -ne 1 -a $a -ne 2 ]&& echo 输入错误!
[root@shell day02]# sh testday2-10.sh 
请输入一个字符或者数字:1
1
[root@shell day02]# sh testday2-10.sh 
请输入一个字符或者数字:2
2
[root@shell day02]# sh testday2-10.sh 
请输入一个字符或者数字:3
输入错误!

2、 开发shell脚本,分别以脚本传参方式和read读入方式比较两个整数大小,用条件表达式(禁止if)进行判断并以屏幕输出的方式提醒用户比较结果。(一共需要开发2个脚本,在传参和read读入方式实现时,需要对变量是否为数字及传参个数是否正确给予提示)

1)判断是否是两个参数

2)判断是否为整数

3)[ 2 -gt 3 ] && echo “2大于3”|| echo “2等于3”|| echo “2小于3“

第一种read读入方式

[root@shell scripts]# cat testday2-8.sh
#!/bin/bash
#read读入方式
read -p "请输入两个整数: " a b
#判断是否为整数
expr $a + $b &> /dev/null
[ $? -eq 0 ]&& echo 参数正确!||{
    echo "参数必须为整数"
    exit 2
}
[ $a -gt $b ]&& {
    echo "数值对比: [$a] > [$b]"
}||{
[ $a -lt $b ]&& {
    echo "数值对比: [$a] < [$b] "
}||{
[ $a -eq $b ]&& {
        echo "数值对比: [$a] = [$b]"
        }
    }
}
[root@shell scripts]# sh testday2-8.sh
请输入两个整数: 5 6
参数正确!
数值对比: [5] < [6] 
[root@shell scripts]# sh testday2-8.sh
请输入两个整数: 8 1
参数正确!
数值对比: [8] > [1]
[root@shell scripts]# sh testday2-8.sh
请输入两个整数: 8 8
参数正确!
数值对比: [8] = [8]
[root@shell scripts]# sh testday2-8.sh
请输入两个整数: 2.1 1
参数必须为整数

第二种传参方式

[root@shell scripts]# cat testday2-9.sh 
#!/bin/bash
#传参方式
#判断是否是两个参数
[ $# -ne 2 ]&&{
    echo "请输入两个参数进行对比!"
    exit
}
#判断是否为整数
expr $1 + $2 &> /dev/null
[ $? -eq 0 ]&& echo 参数正确!||{
    echo "参数必须为整数"
    exit 
}
#数值对比
[ $1 -gt $2 ]&& {
    echo "数值对比: [$1] > [$2]"
}
[ $1 -lt $2 ]&& {
    echo "数值对比: [$1] < [$2] "
}
[ $1 -eq $2 ]&& {
    echo "数值对比: [$1] = [$2]"
}
[root@shell scripts]# sh testday2-9.sh 8 8
参数正确!
数值对比: [8] = [8]
[root@shell scripts]# sh testday2-9.sh 8 6
参数正确!
数值对比: [8] > [6]
[root@shell scripts]# sh testday2-9.sh 6 8
参数正确!
数值对比: [6] < [8] 
[root@shell scripts]# sh testday2-9.sh 6 8.1
参数必须为整数

3、 打印菜单,按照选择项选择你喜欢的美女

示例菜单:

[root@oldboy scripts]# sh meinv.sh

1.heijiajia

2.高圆圆

3.蔡徐坤

please input the num you like: 

要求:

1)当用户输入1时,输出“I guess you like heijiajia”,然后退出脚本

2)当用户输入非1-3的字符时,输出“I guess you are not man”,然后退出脚本

[root@shell scripts]# cat caidan.sh 
#!/bin/bash
prefix="I guess you like "

#菜单
cat <<EOF
    1.heijiajia
    2.高圆圆
    3.蔡徐坤
EOF

read -p "please input the num you like: " num
[ $num -eq "1" ] && {
    echo "$prefix"heijiajia
}
[ $num -eq "2" ] && {
    echo "$prefix"高圆圆
}
[ $num -eq "3" ] && {
    echo "打篮球那个 Are You OK??"
}

#echo -e "\t1.heijiajia\n\t2.gaoyuanyuan\n\t3.caixukun"

[root@shell scripts]# sh caidan.sh 
    1.heijiajia
    2.高圆圆
    3.蔡徐坤
please input the num you like: 1
I guess you like heijiajia
[root@shell scripts]# sh caidan.sh 
    1.heijiajia
    2.高圆圆
    3.蔡徐坤
please input the num you like: 2
I guess you like 高圆圆
[root@shell scripts]# sh caidan.sh 
    1.heijiajia
    2.高圆圆
    3.蔡徐坤
please input the num you like: 3
打篮球那个 Are You OK??


Shell练习作业

1.检查OSPF route-ID配置,配置如下,请用shell编写代码,条件如下:

检查OSPF route-ID配置,配置如下,请用shell编写代码,条件如下:
1、检查ospf的route-id值
2、route-id值必须与interface LoopBack0的IP地址值相同
grep -A 1 "interface LoopBack0" 3.txt | sed -n '$p' | awk '{print $3}
3、如果两个值不相等,或ospf的route-id值不以139开头,则打印出route-id的值
ofpf 100
route-id 139.11.0.1
 area 0.0.0.0
    network 139.11.0.1 0.0.0.0
    network 140.11.0.0 0.0.0.3
    network 140.11.0.8 0.0.0.3
    network 140.11.0.16 0.0.0.3
network 140.11.0.24 0.0.0.3
network 140.11.0.32 0.0.0.3
#
interface LoopBack0
 ip address 139.11.0.1 255.255.255.255
#

image
image
[root@shell day02]# vim zuoye01.sh 
  1 #!/bin/bash                                                                                    
  2 ##############################################################
  3 # File Name: zuoye01.sh
  4 # Version: V1.0
  5 # Author: lcx
  6 # Organization: www.oldboyedu.com
  7 ##############################################################
  8 #ospf route-ID配置文件路径/server/scripts/day02/3.txt
  9 dir=/server/scripts/day02/3.txt
 10 routeID=`cat $dir |awk 'NR==2{print $2}'`
 11 interfaceIP=`grep -A 1 "interface LoopBack0" $dir|awk 'NR==2{print $3}'`
 12 routeIPhead=`cat $dir |awk -F"[ .]+" 'NR==2{print $2}'`
 13 head="139"
 14 #检查ospf的route-id值
 15 echo "osps的route-id为: $routeID"
 16 #检查route-id与interface LoopBack0IP是否相同
 17 [ "$routeID" != "$interfaceIP" ]&&{
 18     echo "1.IP与ID不相等 IP为:$interfaceIP ID为$routeID"
 19 }
 20 [ "$routeIPhead" != "139" ]&&{
 21     echo "2.route-id的值不是139开头 routeID为:$routeID"
 22 }                                                                  
[root@shell day02]# sh zuoye01.sh 
osps的route-id为: 239.11.0.1
1.IP与ID不相等 IP为:139.11.0.1 ID为239.11.0.1
2.route-id的值不是139开头 routeID为:239.11.0.1
[root@shell day02]# sh zuoye01.sh 
osps的route-id为: 139.11.0.1

2.处理以下文件内容,将域名提取并进行计数排序,如处理:

处理以下文件内容,将域名提取并进行计数排序,如处理:
http://www.baidu.com/index.html
http://www.baidu.com/1.html
http://post.baidu.com/index.html
http://mp3.baidu.com/index.html
http://www.baidu.com/3.html
http://post.baidu.com/2.html
得到如下结果:
域名的出现次数  域名
3   www.baidu.com
2   post.baidu.com
1   mp3.baidu.com

思路:

image
[root@shell day02]# cat 4.txt |awk -F'[/]' '{print $3}'|sort|uniq -c|sort -rn|sed '1i域名的出现次数  域名'
域名的出现次数  域名
      3 www.baidu.com
      2 post.baidu.com
      1 mp3.baidu.com

3.打印菜单,按照选择项一键安装不同的web服务

打印菜单,按照选择项一键安装不同的web服务
示例菜单:
[root@oldboy scripts]# sh menu.sh
 1.[install lnmp]
 2.[install lamp]
 3.[exit]
please input the num you want: 
 要求:
 1)当用户输入1时,输出“start installing lamp提示”,然后执行/server/scripts/lamp.sh,(执行方式使用全路径方式执行)。
   脚本内容输出“lamp is installed”并退出脚本,此为工作中的一键安装lamp脚本
 2)当用户输入2时,输出“start installing lnmp提示”,然后执行/server/scripts/lnmp.sh, (执行方式使用 全路径方式执行)。
  脚本内容输出“lnmp is installed”并退出脚本,此为工作中的一键安装lnmp脚本
 3)当输出3时,退出当前菜单及脚本  
 4)当用户输入非1-3的字符时,输出“Input Error”,然后退出脚本
 5)对执行的脚本进行相关的条件判断,例如:脚本是否存在,是否可执行等操作,尽量使用今天讲的知识点

image
#技术水平有限,不求精简只求实现

[root@shell day02]# cat zuoye02.sh 
#!/bin/bash
##############################################################
# File Name: zuoye02.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
#检测脚本是否存在且非空,是否可执行
file1=`[ -s /server/scripts/lamp.sh ]&& echo ture||echo fluse`
file2=`[ -s /server/scripts/lnmp.sh ]&& echo ture||echo fluse`
exec1=`[ -x /server/scripts/lamp.sh ]&& echo ture||echo fluse`
exec2=`[ -x /server/scripts/lnmp.sh ]&& echo ture||echo fluse`
[ $file1 = "ture" ]&& echo lamp.sh脚本文件存在且非空||{
    echo "lamp.sh脚本文件不存在或是一个空文件!!!"
    }&&{
    [ $exec1 = "ture" ]&& echo lamp.sh脚本文件可以执行||{
        echo "lamp.sh脚本文件不可执行!!!"
    }&&{
    [ $file2 = "ture" ]&& echo lnmp.sh脚本文件存在且非空||
        echo -eq "lnmp.sh脚本文件不存在或是一个空文件!!!"
    }&&{
    [ $exec2 = "ture" ]&& echo lnmp.sh脚本文件可以执行||{
        echo "lnmp.sh脚本文件不可执行!!!"
        exit
       }
    }
}
#打印菜单,按照选择项一键安装不同的web服务
cat <<EOF
    1.[install lnmp]
    2.[install lamp]
    3.[exit]
EOF

read -p "please input the num you want:" num
#安装lamp环境
[ $num -eq "1" ] &&{
    echo "start installing LAMP"
    sleep 1
    /server/scripts/lamp.sh
    exit
    }||{
    [ $num -eq "2" ] &&{
        echo "start installing LNMP"
        sleep 1
        /server/scripts/lnmp.sh
        exit
        }
    }||{
    [ $num -eq "3" ] &&{
        echo "即将退出脚本..."
        sleep 1
        exit
        }
    }||{
    [ $num != "{1..3}" ]&&{
        echo "Input Error错误!"
        exit
    }
}

测试结果

image
image
image
image

if语句

if条件语句,简单来说,其语义类似于汉语中的“如果...那么...”。if语句是Linux运维人员在实际生产过程中使用的最频繁也是最重要的语句。因此,务必重视if条件语句的知识,并牢固掌握。

单分支

image

双分支

image

多分支

image

练习题—1

image
image
[root@shell init.d]# pwd
/etc/init.d
[root@shell init.d]# cat rsyncd 
#!/bin/bash
#如果参数是start则启动start rsync --daemon
if [ "$1" = "start" ];then
    rsync --daemon
    sleep 1
    echo "rsync服务启动成功"
fi
#如果参数是stop则关闭--pkill rsync
if [ "$1" = "stop" ];then
    #查看当前rsync进程是否存在,非0则存在
    if [ `ss -lntup|grep rsync|wc -l` -eq 0 ];then
        echo "rsync处于关闭状态"
    else
        sleep 1
        pkill rsync
    fi
fi
#如果是restart则先执行stop再执行start
if [ "$1" = "restart" ];then
    #先关闭
    if [ `ss -lntup|grep rsync|wc -l` -eq 0 ];then
        echo "rsync处于关闭状态"
    else
        sleep 1
        pkill rsync
    fi
    #再次启动
    rsync --daemon
    echo "rsync服务重启成功"
fi
[root@shell init.d]# ss -lntup|grep rsync
[root@shell init.d]# sh rsyncd start
rsync服务启动成功
[root@shell init.d]# ss -lntup|grep rsync
tcp    LISTEN     0      5         *:873                   *:*                   users:(("rsync",pid=10519,fd=4))
tcp    LISTEN     0      5        :::873                  :::*                   users:(("rsync",pid=10519,fd=5))
[root@shell init.d]# sh rsyncd stop
[root@shell init.d]# ss -lntup|grep rsync
[root@shell init.d]# sh rsyncd restart
rsync处于关闭状态
rsync服务重启成功
[root@shell init.d]# ss -lntup|grep rsync
tcp    LISTEN     0      5         *:873                   *:*                   users:(("rsync",pid=10538,fd=4))
tcp    LISTEN     0      5        :::873                  :::*                   users:(("rsync",pid=10538,fd=5))

#绝对路径执行方法
需要添加执行权限
[root@shell ~]# /etc/init.d/rsyncd restart
[root@shell ~]# /etc/init.d/rsyncd stop
[root@shell ~]# /etc/init.d/rsyncd start

练习题—2

判断nginx是否活着,如果没有活着就打印“邮件报警”(判断依据:curl/wget访问url)
#取状态码的值
curl -sw "%{http_code}\n" -o /dev/null 127.0.0.1
curl -I 127.0.0.1 2>/dev/null|grep -o 200

image
image
[root@shell day03]# cat zuoye03.sh
#!/bin/bash
##############################################################
# File Name: zuoye03.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
#判断nginx是否活着,如果没有活着就打印“邮件报警
curl -I 127.0.0.1 2>/dev/null|grep -o 200
if [ $? = 0 ];then
    echo Nginx服务处于运行状态
else
    echo -e "警告!\n\tNginx服务处于关闭状态"
    echo -e "一级警告:\n\tNginx服务处于关闭状态,网站可能宕机,请尽快处理!"|mail -s "Nginx服务报警" 245684979@qq.com
fi


练习题—3

image

函数

image

函数名的定义规则和变量是一样:数字、字母、下划线、但是不能以数字开头

写函数的三种方法

[root@shell day04]# cat test1.sh
#!/bin/bash
##############################################################
# File Name: test1.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
#第一种方法
#定义函数,函数加载到内存
function hello(){
    echo "hello oldchang"
    # return n
}
#使用函数
hello

#第二种方法
function hello2 {
    echo "hello2 2oldboychang"
}
hello2

#第三种方法
hello3(){
    echo "hello3 3oldoychang"
}
hello3
[root@shell day04]# sh test1.sh
hello oldchang
hello2 2oldboychang
hello3 3oldoychang

可以在函数下一起调用

优先调用函数


[root@shell day04]# touch hello
[root@shell day04]# chmod +x hello 
[root@shell day04]# echo hello >hello 
[root@shell day04]# ll
total 8
-rwxr-xr-x 1 root root   6 Jul 18 10:00 hello
-rw-r--r-- 1 root root 501 Jul 18 09:57 test1.sh
[root@shell day04]# 
[root@shell day04]# source /server/scripts/day04/test1.sh 
hello oldchang
hello2 2oldboychang
hello3 3oldoychang
[root@shell day04]# hello   #优先调用了函数
hello oldchang  

函数的退出状态码

脚本的退出状态码,使用exit定义,之后脚本退出

函数的退出状态码,使用return定义,之后函数退出

[root@shell day04]# vim test1.sh 
  1 #!/bin/bash                                                                 
  2 ##############################################################
  3 # File Name: test1.sh
  4 # Version: V1.0
  5 # Author: lcx
  6 # Organization: www.oldboyedu.com
  7 ##############################################################
  8 #
  9 #
 10 function hello(){
 11     if [ -f "/etc/hosts" ];then
 12         echo "文件存在"
 13     else
 14         return 2
 15     fi
 16 }
 17 hello
 18 echo $?
[root@shell day04]# sh test1.sh 
文件存在
0

带参数的函数

image
[root@shell day04]# vim test2.sh 
  1 #!/bin/bash
  2 function hello {
  3     echo "hello $1"
  4 }
  5 hello $1
[root@shell day04]# sh test2.sh oldboy
hello oldboy

[root@shell day04]# vim test2.sh 
  1 #!/bin/bash
  2 function hello {
  3    echo "hello $1 $2"   #定义2个参数
  4 }                                                                           
  5 hello $1 $2
[root@shell day04]# sh test2.sh oldboy oldchang
hello oldboy oldchang

image

位置函数

[root@shell day04]# cat test3.sh 
#!/bin/bash
function hello {
   echo "hello $*"
}
hello $# $1 "$*"
[root@shell day04]# sh test3.sh 1 2 3
hello 3 1 1 2 3

第二种方法,也是最常用的方法

[root@shell day04]# cat test3.sh 
#!/bin/bash
function hello {
   echo "脚本名称: $0"
   echo "函数的参数个数: $#"
   echo "第一个参数: $1"
   echo "显示所有参数: $*"
   echo "执行状态码: $?"
}
hello $*
[root@shell day04]# sh test3.sh 1 2 3 4 5
脚本名称: test3.sh
函数的参数个数: 5
第一个参数: 1
显示所有参数: 1 2 3 4 5
执行状态码: 0

image

case语句

image
image
image

case条件语句练习

image
[root@shell day04]# cat case1.sh
#!/bin/bash
##############################################################
# File Name: case1.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
case "$1" in
    "start"|"START")
        echo "已启动"
        ;;
    "stop"|"STOP")
        echo "已停止"
        ;;
    *)
        echo "你tm说的啥"
esac
 [root@shell day04]# sh case1.sh start
已启动
[root@shell day04]# sh case1.sh stop
已停止
[root@shell day04]# sh case1.sh xxx
你tm说的啥
[root@shell day04]# sh case1.sh START
已启动
[root@shell day04]# sh case1.sh STOP
已停止

练习题

image

练习

image
image

使用case判断是数字还是字母

编写脚本,使用单个字符进行传参,使用case判断是数字还是字母

[root@shell day04]# cat case2.sh 
#!/bin/bash
##############################################################
# File Name: case1.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
case "$1" in
    [0-9])
        echo "这是数字$1"
        ;;
    [a-Z])
        echo "这是字母$1"
        ;;
    *)
        echo "你tm输的啥"
        exit
esac

[root@shell day04]# sh case2.sh v
这是字母v
[root@shell day04]# sh case2.sh A
这是字母A
[root@shell day04]# sh case2.sh 5
这是数字5
[root@shell day04]# sh case2.sh 0
这是数字0

将” 打印菜单修改成case或if语句

将” 打印菜单,按照选择项一键安装不同的web服务”脚本,将其中的条件表达式修改成case或if语句**

#case语句

[root@shell day04]# cat web.sh 
#!/bin/bash
##############################################################
# File Name: zuoye02.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
#检测脚本是否存在且非空,是否可执行
file1=`[ -s /server/scripts/lamp.sh ]&& echo ture||echo fluse`
file2=`[ -s /server/scripts/lnmp.sh ]&& echo ture||echo fluse`
exec1=`[ -x /server/scripts/lamp.sh ]&& echo ture||echo fluse`
exec2=`[ -x /server/scripts/lnmp.sh ]&& echo ture||echo fluse`
case "$file1" in
    ture)
        echo -e "\033[32mlamp.sh脚本文件存在且非空\033[0m"
        ;;
    *)
        echo -e "\033[31mlamp.sh脚本文件不存在或是一个空文件!!!\033[0m"
    esac
case "$exec1" in
    ture)
        echo -e "\033[32mlamp.sh脚本文件可以执行\033[0m"
        ;;
    *)
        echo -e "\033[31mlamp.sh脚本文件不可执行!!!\033[0m"
    esac
case "$file2" in
    ture)
        echo -e "\033[32mlnmp.sh脚本文件存在且非空\033[0m"
        ;;
    *)
        echo -e "\033[31mlnmp.sh脚本文件不存在或是一个空文件!!!\033[0m"
    esac
case "$exec2" in
    ture)
        echo -e "\033[32mlnmp.sh脚本文件可以执行\033[0m"
        ;;
    *)
        echo -e "\033[31mlnmp.sh脚本文件不可执行!!!\033[0m"
esac
#打印菜单,按照选择项一键安装不同的web服务
cat << EOF
    `echo -e "\033[35m (1).[install lamp]\033[0m"`
    `echo -e "\033[36m (2).[install lnmp]\033[0m"`
    `echo -e "\033[33m (3).[exit]\033[0m"`
EOF

read -p "please input the num you want:" num
#安装lamp与lnmp环境
case "$num" in
    1)
        echo start installing LAMP
        sleep 1
        /server/scripts/lamp.sh
        exit
        ;;
    2)
        echo start installing LNMP
        sleep 1
        /server/scripts/lnmp.sh
        exit
        ;;
    3)
        echo 即将退出脚本...
        sleep 1
        exit
        ;;
    *)
        echo Input Error输入不识别!,启动自毁程序...
        sleep 2
        echo 再见人类......
        sleep 2
        exit
esac

image
#  if语句

[root@shell day04]# cat /server/scripts/day03/zuoye02.sh 
#!/bin/bash
##############################################################
# File Name: zuoye02.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
#检测脚本是否存在且非空,是否可执行
file1=`[ -s /server/scripts/lamp.sh ]&& echo ture||echo fluse`
file2=`[ -s /server/scripts/lnmp.sh ]&& echo ture||echo fluse`
exec1=`[ -x /server/scripts/lamp.sh ]&& echo ture||echo fluse`
exec2=`[ -x /server/scripts/lnmp.sh ]&& echo ture||echo fluse`
if [ $file1 = "ture" ];then
        echo "lamp.sh脚本文件存在且非空"
    else 
        echo "lamp.sh脚本文件不存在或是一个空文件!!!"
    fi
if [ $exec1 = "ture" ];then
        echo lamp.sh脚本文件可以执行
    else
        echo lamp.sh脚本文件不可执行!!!
    fi
if [ $file2 = "ture" ];then
        echo lnmp.sh脚本文件存在且非空
    else
        echo lnmp.sh脚本文件不存在或是一个空文件!!!
    fi
if [ $exec2 = "ture" ];then
        echo lnmp.sh脚本文件可以执行
    else
        echo lnmp.sh脚本文件不可执行!!!
        exit
    fi
#打印菜单,按照选择项一键安装不同的web服务
cat << EOF
    `echo -e "\033[35m (1).[install lamp]\033[0m"`
    `echo -e "\033[36m (2).[install lnmp]\033[0m"`
    `echo -e "\033[34m (3).[exit]\033[0m"`
EOF

read -p "please input the num you want:" num
#安装lamp环境
if [ $num = "1" ];then
    echo start installing LAMP
    sleep 1
    /server/scripts/lamp.sh
    exit
elif [ $num = "2" ];then
    echo start installing LNMP
    sleep 1
    /server/scripts/lnmp.sh
    exit
elif [ $num = "3" ];then
    echo 即将退出脚本...
    sleep 1
    exit
elif [ $num != "{1..3}" ];then
    echo Input Error输入不识别!,启动自毁程序...
    sleep 2
    echo 再见人类......
    sleep 2
    exit
fi

将Nginx服务改为case方式+函数方式

将Nginx服务管理脚本改为case方式+函数方式,并通过systemctl进行控制启动停止

先将nginx编译好

yum install -y gcc-c++ pcre-devel zlib-devel    #下载依赖
tar xf nginx-1.17.1.tar #解压到当前目录
cd nginx-1.17.1/    #切换到解压后的目录下
./configure --prefix=/usr/local/nginx   #路径随意
make && make install

[root@shell ~]# ll /usr/local/nginx/sbin/nginx 
-rwxr-xr-x 1 root root 3830336 Jul 18 09:19 /usr/local/nginx/sbin/nginx
[root@shell ~]# cd /etc/init.d/
[root@shell init.d]# touch nginx
[root@shell init.d]# chmod +x nginx

if方式+函数方式

[root@shell init.d]# vim nginx  #
#!/bin/bash
##############################################################
# File Name: nginx.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
if [ "$1" = "start" ];then
    nginx
    echo "nginx服务启动成功"
fi
if [ "$1" = "stop" ];then
#查看当前nginx进程是否存在,非0则存在
    if [ `ss -lntup|grep nginx|wc -l` -eq 0 ];then
        echo "nginx处于关闭状态"
    else
        pkill nginx
    fi
fi
if [ "$1" = "restart" ];then
#先关闭
    if [ `ss -lntup|grep nginx|wc -l` -eq 0 ];then
        echo "nginx处于关闭状态"
    else
        pkill nginx
        sleep 1
    fi
    nginx
    echo "nginx服务重启成功"
fi

case方式+函数方式

#为nginx添加systemd启动文件
[root@shell init.d]# cd /usr/lib/systemd/system
[root@shell system]# cat nginx_oldboy.service 
[Unit]
Description=nginx service
After=nginx_oldboy.target

[Service]
Type=forking
ExecStart=/etc/init.d/nginx start
ExecReload=/etc/init.d/nginx restart
ExecStop=/etc/init.d/nginx stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

#检查是否可以启动关闭重启
[root@shell system]# ss -lntup|grep nginx
[root@shell system]# systemctl start nginx_oldboy.service   #启动
[root@shell system]# ss -lntup|grep nginx
tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=15894,fd=6),(nginx",pid=15893,fd=6))
[root@shell system]# systemctl stop nginx_oldboy.service    #关闭
[root@shell system]# ss -lntup|grep nginx
[root@shell system]# systemctl restart nginx_oldboy.service     #重启
[root@shell system]# ss -lntup|grep nginx
tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=15926,fd=6),(nginx",pid=15925,fd=6))

使用case选择水果,打印水果名及其颜色

使用case选择水果,并打印水果名及其颜色

#给到的要求与条件
  1.apple
  2.pear
  3.banana
  4.blueberry
其中,颜色表达式分别为
31m 红色
32m 绿色
33m 黄色
34m 蓝色
使用方式为
[root@oldboy-node101 ~]# echo -e "\E[1;31m我是红色 \E[0m"
我是红色 
[root@oldboy-node101 ~]# echo -e "\E[1;32m我是绿色 \E[0m"
我是绿色 
[root@oldboy-node101 ~]# echo -e "\E[1;33m我是黄色 \E[0m"
我是黄色 
[root@oldboy-node101 ~]# echo -e "\E[1;34m我是蓝色 \E[0m"
我是蓝色
1)打印菜单
2)使用read,显示一句话“选择你喜欢的水果”
3)使用case判断数字是【1|2|3|4】
4)如果都不符合,报错退出

while循环

image

while语法

image
image

while按行读入文件

image

练习

1.while循环从1加到100,然后再额外使用两种方式计算

2.while循环读入数据,计算文件内的年龄平均值

3.将第6章的练习1,改为死循环的形式。菜单中加入选项exit,只有输入exit才能退出

1.while循环从1加到100,然后再额外使用两种方式计算

[root@shell day04]# cat while3.sh
#!/bin/bash
##############################################################
# File Name: while3.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
#while循环从1加到100,然后再额外使用两种方式计算
a=0
while [ $a -lt 100 ];do
    let a++
    echo $a
done
[root@shell day04]# sh while3.sh
1
2
3
4
...
100

#第二种
[root@shell day04]# echo "(1+100)*100/2"|bc
5050

2.while循环读入数据,计算文件内的年龄平均值

[root@shell day04]# cat age.txt 
jiaojiao 20
yingqian 20
jiangyuan 25
xiaolu 30
xuxu 18
dingsheng 38
lili 5
[root@shell day04]# cat while4.sh 
#!/bin/bash
##############################################################
# File Name: while3.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
#计算平均年龄,文件是/server/scripts/age.txt
#a=echo `cat age.txt|awk '{print $2}'`
sum=0
count=0
while read line;do
    age=`echo $line|awk '{print $2}'`
    let sum=${sum}+${age}
    let count++
done  < $1
echo "$sum/$count"|bc
[root@shell day04]# sh while4.sh age.txt
22

3.将第6章的练习1,改为死循环的形式。菜单中加入选项exit,只有输入exit才能退出

[root@shell day04]# cat caidan.sh 
#!/bin/bash
#打印菜单,按照选择项选择你喜欢的人物
prefix="I guess you like "
#菜单
while true ;do
cat << EOF
    `echo -e "\033[32m 1.棋王\033[0m"`
    `echo -e "\033[33m 2.女神\033[0m"`
    `echo -e "\033[34m 3.娘炮\033[0m"`
    `echo -e "\033[35m 4.铁人\033[0m"`
    `echo -e "\033[36m 5.退出\033[0m"`
EOF
read -p "please input the num you like: " num
if [ $num = "1" ];then
        echo "$prefix"黑嘉嘉
    elif [ $num = "2" ];then
        echo "$prefix"高圆圆
    elif [ $num = "3" ];then
        echo "$prefix"打篮球的那个蔡徐坤? Are You OK??
    elif [ $num = "4" ];then
        echo "$prefix"鹿晗...
    elif [ $num = "5" ];then
        echo "即将退出..."
        sleep 1
        exit
    else
        echo "输入错误!请重新输入"
    fi
done

image

练习

image

1、猜数字游戏:

首先让系统随机生成一个数字,给这个数字定一个范围,让用户输入猜的数字,对输入的数字进行判断,如果不符合要求,就给与高或低的提示,猜对后给出猜对用的次数,请用while语句实现。

image
image.png

RANDOM%99+1)) 0到100随机数字

[root@shell lianxi]# cat 2.1.sh 
#!/bin/bash
##############################################################
# File Name: 2.1.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
#定义输入的次数
total=0
#定义字符集
export LANG="zh_CH.UTF-8"
#生成0到100随机数字并清除
num=$((RANDOM%101))
echo "生成随机数为$num"
echo "============================"
usleep 100000
clear
echo "客官~猜一猜我奶奶多大年龄了?
      请输入[1-100]的整数"
#定义检测输入值的函数age

age(){
    read -p "客官~请输入你猜的年龄: " num1
    #判断是否为整数
    expr $num1 + 1 &>/dev/null
    if [ $? -ne 0 ];then
        echo "(⊙o⊙)…输入格式错了呢~客官"
        age
    fi
}
#定义输入值反馈函数
point(){
    #调用total累计客官输入次数
    ((total++))
    if [ $num1 -eq $num ];then
        echo "客官~您真是个天才!恭喜您获得奶奶一车"
        echo "我奶奶今年${num}岁"
        echo 一共猜了${total}次
        exit 0
    elif [ $num1 -gt $num ];then
        echo "客官~我奶奶老年轻了!您猜的太大了"
        echo "再来一次!加油~: "
        age
    elif [ $num1 -lt $num ];then
        echo "客官~我奶奶比我大!您猜的太小了"
        echo "再来一次!加油~"
        age
    fi
}
#定义循环此脚本函数,猜对年龄后退出,猜错则从point函数中调用age函数继续猜
main(){
    age
    while true
    do
        point
    done
}
main
[root@shell lianxi]# sh 2.1.sh 
生成随机数为58
============================
客官~猜一猜我奶奶多大年龄了?
      请输入[1-100]的整数
客官~请输入你猜的年龄: 50
客官~我奶奶比我大!您猜的太小了
再来一次!加油~
客官~请输入你猜的年龄: 80
客官~我奶奶老年轻了!您猜的太大了
再来一次!加油~
客官~请输入你猜的年龄: 60
客官~我奶奶老年轻了!您猜的太大了
再来一次!加油~
客官~请输入你猜的年龄: 55
客官~我奶奶比我大!您猜的太小了
再来一次!加油~
客官~请输入你猜的年龄: 57
客官~我奶奶比我大!您猜的太小了
再来一次!加油~
客官~请输入你猜的年龄: 58
客官~您真是个天才!恭喜您获得奶奶一车
我奶奶今年58岁
一共猜了6次

2.使用if和while实现菜单系统信息案例:

​ h 显示命令帮助 sleep 2刷新菜单

​ f 显示登录信息 who

​ d 显示磁盘挂载 fdisk -l

​ m 查看内存使用 free -h

​ u 查看系统负载 uptime

​ q 退出程序

[root@shell lianxi]# cat menu.sh 
#!/bin/bash
##############################################################
# File Name: menu.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
export LANG="zh_CH.UTF-8"
user=`who|wc -l`
free1=`free -h|awk 'NR==2{print $3/$2*100}'`
free2=${free1/.*/}
uptime=`uptime|awk '{print $NF}'`
while true ;do
cat << EOF
    `echo -e "\033[32m [h].显示命令帮助\033[0m"`
    `echo -e "\033[32m [f].显示登录信息\033[0m"`
    `echo -e "\033[32m [d].显示磁盘挂载\033[0m"`
    `echo -e "\033[32m [m].查看内存使用\033[0m"`
    `echo -e "\033[32m [u].查看系统负载\033[0m"`
    `echo -e "\033[35m [q].退出程序\033[0m"`
EOF
read -p "请输入要查询的信息编号: " NUM
if [ "$NUM" = "h" ];then
    sleep 1
    clear
    echo -e "\033[32m\n\t\t\t\t[刷新成功!]\033[0m"
elif [ "$NUM" = "f" ];then
    echo -e "\033[32m\n\t\t\t\t当前在登录[$user]用户\033[0m"
    who
elif [ "$NUM" = "d" ];then
    echo -e "\033[32m\n\t\t\t\t[当前磁盘挂载情况!]\033[0m"
    fdisk -l
elif [ "$NUM" = "m" ];then
    echo -e "\033[32m\n\t\t\t\t[当前内存已用$free2%]\033[0m"
    free -h
elif [ "$NUM" = "u" ];then
    echo -e "\033[32m\n\t\t\t\t[15分钟内系统负载为$uptime]\033[0m"
    uptime
elif [ "$NUM" = "q" ];then
    echo "bye~客官"
    exit 0
else
    echo -e "\033[31m\n\t\t\t\t输出格式不对!请重新输入编号\033[0m"
fi
done

实现效果

[root@shell lianxi]# sh menu.sh 
     [h].显示命令帮助
     [f].显示登录信息
     [d].显示磁盘挂载
     [m].查看内存使用
     [u].查看系统负载
     [q].退出程序
请输入要查询的信息编号: h

                [刷新成功!]
     [h].显示命令帮助
     [f].显示登录信息
     [d].显示磁盘挂载
     [m].查看内存使用
     [u].查看系统负载
     [q].退出程序
请输入要查询的信息编号: f

                当前在登录[3]用户
root     tty1         Jul 18 15:17
root     pts/0        Jul 18 08:34 (10.0.0.1)
root     pts/1        Jul 18 08:49 (10.0.0.1)
     [h].显示命令帮助
     [f].显示登录信息
     [d].显示磁盘挂载
     [m].查看内存使用
     [u].查看系统负载
     [q].退出程序
请输入要查询的信息编号: d

                [当前磁盘挂载情况!]

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000e3d5f

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      411647      204800   83  Linux
/dev/sda2          411648     2508799     1048576   82  Linux swap / Solaris
/dev/sda3         2508800    41943039    19717120   83  Linux
     [h].显示命令帮助
     [f].显示登录信息
     [d].显示磁盘挂载
     [m].查看内存使用
     [u].查看系统负载
     [q].退出程序
请输入要查询的信息编号: m

                [当前内存已用11%]
              total        used        free      shared  buff/cache   available
Mem:           972M        107M        400M        7.7M        464M        688M
Swap:          1.0G          0B        1.0G
     [h].显示命令帮助
     [f].显示登录信息
     [d].显示磁盘挂载
     [m].查看内存使用
     [u].查看系统负载
     [q].退出程序
请输入要查询的信息编号: u

                [15分钟内系统负载为0.05]
 20:14:06 up 11:42,  3 users,  load average: 0.00, 0.01, 0.05
     [h].显示命令帮助
     [f].显示登录信息
     [d].显示磁盘挂载
     [m].查看内存使用
     [u].查看系统负载
     [q].退出程序
请输入要查询的信息编号: q
bye~客官
[root@shell lianxi]# 

3、while循环批量创建10个用户,并通过传参方式传入密码123

创建用户:

useradd test1

添加密码:

echo 123 | passwd --stdin test1

批量创建

seq 1 10

[root@shell lianxi]# cat user.sh
#!/bin/bash
##############################################################
# File Name: user.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
#while循环批量创建10个用户,并通过传参方式传入密码123
i=0
user=0
read -p "请为批量创建的用户添加密码: " passwd
#while [ $user -lt 10 ] ;do
while ((i<=10))
do
    ((user=sum+i))
    ((i++))
done
    seq -w $user|sed -r "s#(.*)#useradd test\1;echo $passwd|passwd --stdin test&#g"|bash
[root@shell lianxi]# sh user.sh
请为批量创建的用户添加密码: 123A
useradd: user 'test01' already exists
Changing password for user test01.
passwd: all authentication tokens updated successfully.
useradd: user 'test02' already exists
Changing password for user test02.
passwd: all authentication tokens updated successfully.
...
..

[root@shell lianxi]# tail /etc/passwd
test01:x:1002:1002::/home/test01:/bin/bash
test02:x:1003:1003::/home/test02:/bin/bash
test03:x:1004:1004::/home/test03:/bin/bash
test04:x:1005:1005::/home/test04:/bin/bash
test05:x:1006:1006::/home/test05:/bin/bash
test06:x:1007:1007::/home/test06:/bin/bash
test07:x:1008:1008::/home/test07:/bin/bash
test08:x:1009:1009::/home/test08:/bin/bash
test09:x:1010:1010::/home/test09:/bin/bash
test10:x:1011:1011::/home/test10:/bin/bash

4. 用case和while循环批量删除用户[y|n]

#暂时用while加if写出来了,此题没有思路
[root@shell lianxi]# cat userdel.sh 
#!/bin/bash
##############################################################
# File Name: user.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
#case方法批量删除用户
#判断是否为root用户
while true ;do
if [ $UID -ne 0 ];then
    echo "必须是root用户才有删除的权限!" user
    exit 1;
fi
read -p "请输入要删除的用户: " name
user=`awk -F: '{print $1}' /etc/passwd|grep "$name"`
if [ $? = 0 ];then
    read -p "此用户是否真的要删除[y|n]: " or
    if [ "$or" = "y" ];then
        userdel -r $user
        echo "$user用户已删除"
    elif [ "$or" = "n" ];then
        echo "返回主页..."
    else
        echo "输入有误!请重新输入"
    fi
else
    echo "${name}用户不存在"
fi
don

5. while循环通过文本来直接创建用户和密码,如果用户存在或者创建失败给予提示

shell编程知识点总结

1.shell是命令解释器,可以解释命令
2.shell脚本是用命令写成的一个可执行的文件
3.shell脚本的用途
批量管理
代码上线
定时备份,定时启停服务
系统监控,服务监控
日志切割,分析

4.编译型语言;
通过某种高级语言翻译成可被系统识别的二进制码

5.解释型语言;
通过解释器对源程序的二进制码进行解释并执行

6.centos的默认解释器是
bash sh

7.父shell的环境变量,子shell可以看到
8.子shell的环境变量,父shell不可以看到
9.shell执行的方式
sh &bash
cat *.sh|bash
sh < .sh
/server/scripts/
.sh 可执行
source *.sh
. *.sh

10.脚本顶格添加解释器声明

!/bin/bash

添加作者 时间 版本号 注释

11.退出shell的命令是
exit

12.环境变量也叫全局变量
定义方式;export 变量名=变量值

13.环境变量的四个执行文件顺序
/etc/profile--->/.bash_profile--->/.bashrc--->/etc/bashrc
登录加载所有
非登录式加载后两个

14.普通变量只能在当前shell下使用
不加引号:适用于一般场景,不能带空格 export 变量名=变量值

单引号:所见即所得 export 变量名='变量值'

双引号:解析双引号内的变量 export 变量名="变量值"

反引号:强制命令解析 export 变量名=命令

变量后有内容需要用{} echo ${name}5

15.用source执行和用bash执行的区别
source可以越权的,bash不可以越权(父子shell)
用source或"."执行的脚本,变量会在父shell下生效,用bash执行的脚本,变量不会再父shell下生效。

16.参数特殊变量
0 获取脚本文件名,如果带路径则包括完整路径n 获取脚本的第n个参数,如12
# 脚本的参数个数* 显示脚本所有的参数
$@ 显示脚本所有的参数

17.进程特殊变量
? 命令执行的状态,0正确 非0错误 $$ 脚本当前进程ID号! 后台运行最后一个进程的ID号
$_ 脚本的最后一个参数

18.变量子串
{name} 返回变量内容{#name} 返回变量字符长度
{name:5}从变量的第五个字符提取子串到结尾{name:5:3}从变量的第五个字符提取长度为3的子串
{name#abc}删除变量开头最短匹配的子串{name##abc}删除变量开头最长匹配的子串
{name%abc}删除变量结尾最短匹配的子串{name%%abc}删除变量结尾最长匹配的子串
{name/abc/ABC}将变量的第一个abc替换为ABC{name//abc/ABC}将变量所有的abc替换为ABC

19.字符串测试表达式
[ "a" = "b" ] 是否相等 赋值不能有空格 判断时必须有空格
[ "a" != "b" ]是否不相等
[ -n "name" ] 是否非空 [ -z "name" ] 是否为空
[ $name ] 是否非空

20.整数二元比较操作符
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于

21.逻辑操作符
-a == && and 与运算 两端都真则为真
-o == || or 或运算 两端有一个为真则为真
! != not 非 相反为真

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,362评论 0 5
  • 本文是对Linux shell编程的一个学习比较,共包括如下章节的内容: 概述 基本语法 结构化语句 函数 小结 ...
    我是老薛阅读 816评论 0 5
  • 搭配《linux就该这样学》第四章内容 1.shell历史 Shell的作用是解释执行用户的命令,用户输入一条命令...
    木鱼_cc阅读 843评论 0 10
  • 原文地址Shell是用户与Linux或Unix内核通信的工具,shell编程指的并不是编写这个工具,而是指利用现有...
    MrRobot阅读 11,810评论 5 30
  • 本文将结合前面介绍的Linux命令、管道符等知识,通过VI编辑器编写Shell脚本,实现能自动化工作的脚本文件。 ...
    黑马腾云阅读 295评论 0 1