shell函数

翻阅目录

1.背景

                 Shell编程总计

怎么要选用shell函数

linux其他的职能

  1. [root@lamp ~]# alias

  2. alias cp=’cp -i’

  3. alias l.=’ls -d .* –color=auto’

  1. alias ll=’ls -l –color=auto’

  2. alias ls=’ls –color=auto’

  3. alias mv=’mv -i’

  4. alias rm=’rm -i’

  5. alias vi=’vim’

  6. alias which=’alias | /usr/bin/which
    –tty-only –read-alias –show-dot –show-tilde’

安装别名与利用

  1. [root@lamp ~]# alias cdone=’cd /’
  1. [root@lamp ~]# alias

  2. alias cdone=’cd /’

  3. alias cp=’cp -i’

  4. alias l.=’ls -d .* –color=auto’

  1. alias ll=’ls -l –color=auto’

  2. alias ls=’ls –color=auto’

  3. alias mv=’mv -i’

  4. alias rm=’rm -i’

  5. alias vi=’vim’

  6. alias which=’alias | /usr/bin/which
    –tty-only –read-alias –show-dot –show-tilde’

  7. [root@lamp ~]# cdone

  8. [root@lamp /]# pwd

  9. /

函数也是兼备和别名类似的效应。函数的效益就是把程序里翻来覆去调研相同的代码部分概念成一份,然后为这一份代码起个名字,其余具有的再度调用这一部分代码都只用调用这些名字就足以。当须要修改那部分重新代码时,只需求变更函数体内的一份代码即可完结调用修改。

采用函数的优势:

1、把相同的程序段定义成函数,可以削减整个程序的代码量。

2、扩充程序的可读性,以及便于管理。

3、可落成程序作用模块化,差其余先后行使函数模块化。

4、让程序代码结构更清晰。

  • 1.1
    for循环语句
  • 1.2
    for循环相关陶冶题
  • 1.3
    while循环语句
  • 1.4
    获取取文件中的行,单词和字符
  • 1.5 break continue exit
    return
  • 1.6
    shell中的数组
  • 1.7 Shell 函数
  • 1.8
    shell脚本的调剂
  • 1.9
    shell编程操练题
  • 1.10
    各类语句小结
  • 1.11 附录
  • 1.12
    linux中的信号
  • 1.13 参考文档

Linux
Shell是一种基础,由于好奇的语法加之较差的可读性,日常被python等剧本代替。既然是基础,那就须求控制,毕竟学习Shell脚本的历程中,仍可以了然到很多Linux系统的内容。Linux脚本大师不是芸芸众生都得以达到的,不过用有些概括的Shell落成部分常见的基本成效仍旧很有必不可少的。

Seq命令统计用法:

shell函数语法

语法格式:

  1. 粗略语法格式

  2. 函数名(){

  3.   指令…

  4.   return n

  5. }

  6. 专业语法格式

  7. function 函数名(){

  8.   指令…

  9.   return n

  10. }

专注:shell的重临值是exit,函数里用return输出重返值。

  

2.正题

选项:

shell函数的实施

调用函数

1)直接实施函数名即可(不带括号)。

函数名

只顾:1、执行函数时,函数后的小括号不须要。2、函数定义及函数体必须在要实践的函数名的面前定义,shell的推行从上到下按行执行。

2)带参数的函数执行办法。

函数名 参数1 参数2

留意:函数的传参湖剧本的传参类似,只是本子名换成函数名即可。

函数后接的参数表达:1、shell的职分参数($1、$2、$3、$4、$5、$#、$*、$?、$@)都得以是函数的参数。2、此时父脚本的参数临时地被函数参数所覆盖或隐藏。3、$0相比卓绝,它依然是父脚本的名目。4、当函数已毕时,原来的一声令下行脚本的参数即復苏。5、在shell函数里面,return命令作用与shell里的exit类似,成效是跳出函数。6、在shell函数体里使用exit会退出整个shell脚本,而不是退出shell函数。7、return语句会重回一个脱离值(再次来到值)给调用函数的次第。8、函数的参数变量是在函数体里面定义,假如是平时变量,一般采纳local
i定义。

回到顶部

1) 热身

-f, –format=格式使用printf 样式的浮点格式

shell函数范例

开发脚本建立多个大约函数并调用执行。

  1. [root@lamp /]# cat fun01.sh

  2. #!/bin/bash

  3. test_fun(){

  4.   echo “i
    am shell fun.”

  5. }

  6. test_fun

  7. [root@lamp /]# sh fun01.sh

  8. i am shell fun.

调用别的脚本文件中的函数。

  1. [root@lamp /]# cat fun01.sh

  2. #!/bin/bash

  3. . /fun02.sh

  4. test_fun(){

  5.   echo “i
    am shell fun.”

  6. }

  7. test_fun

  8. test_fun02

  9. [root@lamp /]# cat fun02.sh

  10. #!/bin/bash

  11. test_fun02(){

  12.   echo “i
    am shell fun02.”

  13. }

  14. [root@lamp /]# sh fun01.sh

  15. i am shell fun.

  16. i am shell fun02.

传参

  1. [root@lamp /]# cat fun01.sh

  2. #!/bin/bash

  3. . /fun02.sh

  4. test_fun(){

  5.   echo “i
    am shell fun.”

  6. }

  7. test_fun

  8. test_fun02 $1

  9. [root@lamp /]# cat fun02.sh

  10. #!/bin/bash

  11. test_fun02(){

  12.   echo “i
    am shell $1.”

  13. }

  14. [root@lamp /]# sh fun01.sh golden

  1. i am shell fun.

  2. i am shell golden.

函数传参转成参数命令行传输,对自由指定url判断是不是丰富。

  1. [root@lamp /]# curl -I -m 3 -o
    /dev/null -s -w %{http_code}
    www.baidu.com

-I 仅测试HTTP头

-m 3 最多询问3秒

-o /dev/null 屏蔽原有输出新闻

-s silent 情势,不出口任何事物

-w %{http_code} 控制额外输出

  1. [root@lamp ~]# cat check_url.sh
  1. #!/bin/bash

  2. [ -f /etc/init.d/functions ]&& .
    /etc/init.d/functions

  3. usage(){

  4.   echo “USAGE:$0 url.”

  5.   exit 1

  6. }

  7. RETVAL=0

  8. check(){

  9.   wget -I 10 –spider -t 2 $1
    &>/dev/null

  10.   RETVAL=$?

  11.   if
    [ $RETVAL -eq 0 ];then

  12.     action “$1 url” /bin/true

  13.   else

  1.     action “$1 url” /bin/false

  2.   fi

  3.   return $RETVAL

  4. }

  5. main(){

  6.   if
    [ $# -ne 1 ];then

  7.     usage

  8.   fi

  9.   check $1

  10. }

  11. main $*

  12. [root@lamp ~]# sh check_url.sh
    www.baidu.com

  13. www.baidu.com url [ OK ]

  14. [root@lamp ~]# sh check_url.sh
    www.baiduxxxx.com

  15. www.baiduxxxx.com url [FAILED]

给字符串加颜色。

  1. [root@lamp ~]# cat color.sh

  2. #!/bin/bash

  3. RED_COLOR=’\E[1;31m’

  4. GREEN_COLOR=’\E[1;32m’

  5. YELLOW_COLOR=’\E[1;33m’

  6. BLUE_COLOR=’\E[1;34m’

  7. PINK=’\E[1;35m’

  8. RES=’\E[0m’

  9. echo -e “$RED_COLOR red $RES”

  10. echo -e “$GREEN_COLOR GREEN $RES”

  11. echo -e “$YELLOW_COLOR YELLOW $RES”

  12. echo -e “$BLUE_COLOR BLUE $RES”

  13. echo -e “$PINK PINK $RES”

输出结果。

澳门金沙国际 1

传2个参数,颜色名称和内容,输出带颜色的情节。

  1. [root@lamp ~]# cat color_str.sh
  1. #!/bin/bash

  2. RED=’\E[1;31m’

  3. GREEN=’\E[1;32m’

  4. YELLOW=’\E[1;33m’

  5. BLUE=’\E[1;34m’

  6. PINK=’\E[1;35m’

  7. RES=’\E[0m’

  8. usage(){

  9.   echo “USAGE:$0 color contents.”

  10.   exit 1

  11. }

  12. color(){

  13.   if
    [ “$1” = “red” ];then

  14.     echo -e “${RED}$2 $RES”

  15.   elif [ “$1” = “green” ];then

  16.     echo -e “${GREEN}$2 $RES”

  17.   elif [ $1 = “yellow” ];then

  18.     echo -e “${YELLOW}$2 $RES”

  19.   elif [ “$1” = “blue” ];then

  20.     echo -e “${BLUE}$2 $RES”

  21.   elif [ “$1” = “pink” ];then

  22.     echo -e “${PINK}$2 $RES”

  23.   else

  1.     echo “$2”

  2.   fi

  3. }

  4. main(){

  5.   if
    [ $# -ne 2 ];then

  6.     usage

  7.   fi

  8.   color $1 $2

  9. }

  10. main $*

出口结果。

澳门金沙国际 2

1.1 for循环语句

     在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行。

     它跟其他的循环,如while循环,最大的不同,是它拥有一个循环计数器,或是循环变数。这使得for循环能够知道在迭代过程中的执行顺序。

1.1.1 shell中的for循环

         shell中的for 循环与在c中不同,它包含三种形式:第一种结构是列表for 循环;第二种结构就是不带列表的for循环;第三种就类似于C语言。

①   列表for循环(常用)

#!/bin/bash
for i in 取值列表
do
    循环主体/命令
done

 

②   不带列表for循环(示例)

#!/bin/absh
echo "惨绿少年的博客是:"  
for i 
     do   
     echo "$i" 
done 

   脚本执行结果

[root@clsn for]# sh  for2.sh http://blog.znix.top
惨绿少年的博客是:
http://blog.znix.top

 

 

③   看似C语言的风格那种用法常在C语语言中使用)

for((exp1;exp2;exp3))
    do
      指令...
done   

         编写类似C语言风格脚本

for((i=0;i<=3;i++))
    do
      echo $i
done  

         本子执行进度

 

上面的例证浮现了什么样向脚本传递参数、脚本怎么着获取参数、if-else判断、变量的行使等主导内容。

-s, –separator=字符串使用指定字符串分隔数字(默许使用:\n)

case结构条件句

1.1.2 分歧语言的For循环

*Shell中的三种样式***

 

# 样式一:
for i in 1 2 3 
  do 
    echo $i
done
# 样式二:
for i in 1 2 3;do  echo $i;done

 

  JAVA

for(int i = 0; i < 5; i++){
    //循环语句;
}

  PHP

for ($i = 0; $i < 5; $i++) {
  # statements;
}

  VB

 

For i = 1 To 5
===PASCAL===
for not i=1 do
begin
   i=0;
   writeln('Go on!');
end.

  '循环语句
Next i

 

  swift

 

var x = 0
for i in 1...100{
    x += i
}
print(x)

//5050
for _ in 1...100{
    x += 1
}
print(x)
// 100

var box = [1,2,3,4,5]
for i in box{
    print(i)
}
/*
1 
2 
3 
4 
5
*/
---

 

回到顶部

#!/bin/bash

-w, –equal-width 在列前添加0 使得宽度相同实例 

case结构条件句语法

case语句其实固然正式的多分支if语句。

  1. case
    “字符串变量” in

  2.   值1) 指令1…

  3. ;;

  4.   值2) 指令2…

  5. ;;

  6.   *) 指令3…

  7. esac

1.2 for循环相关陶冶题

if [[ $# -lt 1 ]]; then
        echo “args count must > 1”
        echo “Uage: bash +x example01.sh [args…]”
        exit
fi

来自: 

case结构条件句范例

依照用户的输入判断是哪位数字。如果用户输入数字输出对应输入的数字,即使是其余内容重返不正确。

  1. [root@lamp ~]# cat case.sh

  2. #!/bin/bash

  3. usage(){

  4.   echo “USAGE:$0 number.”

  5.   exit 1

  6. }

  7. case_fun(){

  8.   case
    $1 in

  9.     [1-3])

  10.       echo $1

  11.   ;;

  12.     *)

  13.       echo “input error.”

  14.   esac

  15. }

  16. main(){

  17.   case
    $# in

  18.     1) case_fun $1

  19.   ;;

  20.     *) usage

  21.   esac

  22. }

  23. main $*

出口结果。

  1. [root@lamp ~]# sh case.sh

  2. USAGE:case.sh number.

  3. [root@lamp ~]# sh case.sh 1

  4. 1

  5. [root@lamp ~]# sh case.sh 2

  6. 2

  7. [root@lamp ~]# sh case.sh 3

  8. 3

  9. [root@lamp ~]# sh case.sh 4

  10. input error.

进行脚本打印一个水果菜单:

1、apple

2、pear

3、banana

4、cherry

当用户采纳水果的时候,打印选拔水果是怎么样,并给水果单词加上颜色。

  1. [root@lamp ~]# cat fruit.sh

  2. #!/bin/bash

  3. RED=’\E[1;31m’

  4. GREEN=’\E[1;32m’

  5. YELLOW=’\E[1;33m’

  6. BLUE=’\E[1;34m’

  7. PINK=’\E[1;35m’

  8. RES=’\E[0m’

  9. FLICKER=’\E[31;5m’

  10. usage(){

  11.   echo -e “${FLICKER}Pls select the exist num behind.
    ${RES}”

  12.   exit 1

  13. }

  14. choice(){

  15.   case
    $num in

  16.     1) echo -e “${BLUE}apple${RES}”

  17.   ;;

  18.     2) echo -e “${GREEN}pear${RES}”

  19.   ;;

  20.     3) echo -e “${YELLOW}banana${RES}”

  21.   ;;

  22.     4) echo -e “${RED}cherry${RES}”

  23.   ;;

  24.     *) usage

  25.   esac

  26. }

  27. main(){

  28.   choice $num

  29. }

  30. echo ”

  31.   1、apple

  32.   2、pear

  33.   3、banana

  34.   4、cherry”

  35. read -t 10 -p “Pls input a num:” num

  36. main $num

echo输出字符串突显不相同颜色。

  1. [root@lamp ~]# echo -e “\033[30m 黑色 \033[0m”

  2. [root@lamp ~]# echo -e “\033[31m 红色 \033[0m”

  3. [root@lamp ~]# echo -e “\033[32m 绿色 \033[0m”

  4. [root@lamp ~]# echo -e “\033[33m 黄色 \Shell编程进阶篇,使用笔记。033[0m”

  5. [root@lamp ~]# echo -e “\033[34m 蓝色 \033[0m”

  6. [root@lamp ~]# echo -e “\033[35m 紫色 \033[0m”

  7. [root@lamp ~]# echo -e “\033[36m 天蓝色 \033[0m”

  8. [root@lamp ~]# echo -e “\033[37m 白色 \033[0m”

澳门金沙国际 3

  1. [root@lamp ~]# echo -e “\033[40;37m 黑底白字 \033[0m”
  1. [root@lamp ~]# echo -e “\033[41;37m 红底白字 \033[0m”
  1. [root@lamp ~]# echo -e “\033[42;37m 绿底白字 \033[0m”
  1. [root@lamp ~]# echo -e “\033[43;37m 黄底白字 \033[0m”
  1. [root@lamp ~]# echo -e “\033[44;37m 蓝底白字 \033[0m”
  1. [root@lamp ~]# echo -e “\033[45;37m 紫底白字 \033[0m”
  1. [root@lamp ~]# echo -e “\033[46;37m 天蓝底白字 \033[0m”
  1. [root@lamp ~]# echo -e “\033[47;30m 白底黑字 \033[0m”

澳门金沙国际 4

越多文字颜色及背景象查看:man console_codes

nginx启动脚本。

  1. [root@lamp ~]# cat nginx_control.sh
  1. #!/bin/bash

  2. [ -f /etc/init.d/functions ] && .
    /etc/init.d/functions

  3. nginx=/application/nginx/sbin/nginx

  1. profile=/application/nginx/logs/nginx.pid
  1. state() {

  2.   RETVAL=$?

  3.   if
    [ $RETVAL -eq 0 ];then

  4.     action “Nginx is $1” /bin/true

  5.   else

  1.     action “Nginx is $1” /bin/false

  2.   fi

  3.   return $RETVAL

  4. }

  5. start() {

  6.   if
    [ -f $pidfile ];then

  7.     echo “Nginx is running”

  8.   else

  1.     $nginx

  2.     RETVAL=$?

  3.     state started

  4.   fi

  5.   return $RETVAL

  6. }

  7. stop() {

  8.   if
    [ ! -f $pidfile ];then

  9.     echo “nginx is not running.”

  10.   else

  1.     $nginx -s stop

  2.     state stoped

  3.   fi

  4.   return $RETVAL

  5. }

  6. reload() {

  7.   if
    [ -f $pidfile ];then

  8.     echo “Can’t open $pidfile,no such file or
    directory.”

  9.   else

  1.     $nginx -s reload

  2.     state reload

  3.   fi

  4.   return $RETVAL

  5. }

  6. case
    “$1” in

  7.   start)

  8.     start

  9.     RETVAL=$?

  10.     ;;

  11.   stop)

  12.     stop

  13.     RETVAL=$?

  14.     ;;

  15.   restart)

  16.     stop

  17.     sleep 2

  18.     restart

  19.     RETVAL=$?

  20.     ;;

  21.   reload)

  22.     reload

  23.     RETVAL=$?

  24.     ;;

  25.   *)

  26.     echo “USAGE:$0 {start|stop|reload|restart}”

  1. esac

  2. exit $RETVAL

case总结:

1、case语句就相当于多分支的if语句。case语句优势是更标准、易读。

2、case语句适合变量的值少,且为固定的数字或字符串集合。(start、stop、restart)。

3、系统服务启动脚本传参的论断多用case语句。

1.2.1 【训练题1】批量变化随机字符文件名案例

拔取for循环在/clsn目录下批量成立10个html文件,其中每个文件要求包括10个随机小写字母加固定字符串clsn,名称示例如下:

[root@znix C19]# ls /clsn
apquvdpqbk_clsn.html  mpyogpsmwj_clsn.html  txynzwofgg_clsn.html   
bmqiwhfpgv_clsn.html  udrzobsprf_clsn.html  vjxmlflawa_clsn.html  
jhjdcjnjxc_clsn.html  qeztkkmewn_clsn.html jpvirsnjld_clsn.html  
ruscyxwxai_clsn.html

本子内容

[root@clsn for]# cat make_file.sh
#!/bin/bash
#############################################################
# File Name: make_file.sh
# Version: V1.0
# Author: clsn
# Organization:
# Created Time : 2017-12-08 11:01:19
# Description:
#############################################################

[ -d /clsn ] || mkdir -p /clsn
rpm -qa |grep pwgen &>/dev/null
if [ $? -eq 1 ]
then
yum install pwgen -y &>/dev/null
fi

cd /clsn &&\
for i in {1..10}
do
#File_Name=`uuidgen |tr “0-9-” “a-z”|cut -c 1-10`
File_Name2=`pwgen -1A0 10`
touch ${File_Name2}_clsn.html
done
批量生成随机字符文件名

 

 1 [root@clsn for]# cat make_file.sh 
 2 #!/bin/bash
 3 #############################################################
 4 # File Name: make_file.sh
 5 # Version: V1.0
 6 # Author: clsn
 7 # Organization: http://blog.znix.top
 8 # Created Time : 2017-12-08 11:01:19
 9 # Description:
10 #############################################################
11 
12 [ -d /clsn ] || mkdir -p /clsn
13 rpm -qa |grep pwgen &>/dev/null
14 if [ $? -eq  1 ] 
15   then 
16     yum install pwgen -y &>/dev/null
17 fi
18 
19 cd /clsn &&\
20 for i in {1..10}
21   do
22    #File_Name=`uuidgen |tr "0-9-" "a-z"|cut -c 1-10`
23    File_Name2=`pwgen -1A0 10`
24    touch ${File_Name2}_clsn.html
25 done

 

剧本执行结果

 

[root@clsn for]# ls -l  /clsn 
-rw-r--r-- 1 root root 0 12月  8 19:41 aegheiriek_clsn.html
-rw-r--r-- 1 root root 0 12月  8 19:41 aifohxique_clsn.html
-rw-r--r-- 1 root root 0 12月  8 19:41 caexahween_clsn.html
-rw-r--r-- 1 root root 0 12月  8 19:41 ciefaivaib_clsn.html
-rw-r--r-- 1 root root 0 12月  8 19:41 eixongooph_clsn.html
-rw-r--r-- 1 root root 0 12月  8 19:41 foozaivedo_clsn.html
-rw-r--r-- 1 root root 0 12月  8 19:41 ireeteethu_clsn.html
-rw-r--r-- 1 root root 0 12月  8 19:41 ohmeebivae_clsn.html
-rw-r--r-- 1 root root 0 12月  8 19:41 oiceehahth_clsn.html
-rw-r--r-- 1 root root 0 12月  8 19:41 sheewaehoo_clsn.html

 

arg=$1

1.横着打印数字

当型循环和直到型循环

while循环工作中运用的不多,一般是看护进度程序或一味循环执行场景,其他循环计算,都会用for替换while。

1.2.2 【磨炼题2】批量化名特殊案例

【操练题1】中结果文件名中的clsn字符串全部改成znix(最好用for循环完毕),并且将扩张名html全体改成大写。

jpvirsnjld_clsn.html   ===> jpvirsnjld_znix.HTML

本子内容:

[root@clsn for2]# cat rename_file.sh
#!/bin/bash
#############################################################
# File Name: rename_file.sh
# Version: V1.0
# Author: clsn
# Organization:
# Created Time : 2017-12-08 11:31:56
# Description:
#############################################################

cd /clsn &&\
File_name=`ls |sed -r ‘s#(.*)_clsn.html#\1#g’`

for i in $File_name
do
if [ -f ${i}_clsn.html ]
then
mv ${i}_clsn.html ${i}_znix.HTML
else
echo “文件修改落成.”
exit
fi
done
批量化名

 

 1 [root@clsn for2]# cat rename_file.sh 
 2 #!/bin/bash
 3 #############################################################
 4 # File Name: rename_file.sh
 5 # Version: V1.0
 6 # Author: clsn
 7 # Organization: http://blog.znix.top
 8 # Created Time : 2017-12-08 11:31:56
 9 # Description:
10 #############################################################
11 
12 cd /clsn &&\
13 File_name=`ls |sed -r 's#(.*)_clsn.html#\1#g'`
14 
15 for i in $File_name
16   do
17    if [ -f ${i}_clsn.html ] 
18      then
19      mv ${i}_clsn.html ${i}_znix.HTML
20    else
21      echo "文件修改完成."
22      exit
23    fi
24 done

 

查看结果

[root@clsn for2]# ls /clsn/
aeyaesughi_znix.HTML  caireasipi_znix.HTML  uahahnieli_znix.HTML
aifaepheeb_znix.HTML  eathixoong_znix.HTML  zalipageen_znix.HTML
akuipheeye_znix.HTML  ietoothaik_znix.HTML
apheikieno_znix.HTML  lachohtaif_znix.HTML

if [[ $arg -gt 10 ]]; then
        echo “$arg > 10”
else
        echo “$arg < 10”
fi
那些剧本的调用情势如下:

 澳门金沙国际 5

当型和直到型循环语句

1、while条件句

语法:

  1. while
    条件

  2.   do

  1.   指令 …

  2. done

2、until条件句

语法:

  1. until 条件

  2.   do

  1.   指令 …

  2. done

不论是条件是还是不是创制都会执行四回。

1.2.2.1  批量改名其余办法

  rename 形式(最便利,专业改名)

rename txt jpg *

*  非 for 循环方式批量化名*(使用sed命令举办拼接,然后交给bash执行)

ls *jpg|sed -r 's#(.*).jpg#mv &  \1.mp4#'|bash

bash +x example01.sh 52).数组、函数传参数,循环

2.竖着打印数字:

当型和直到型基本范例

每隔2秒显示器输出负载值。

  1. [root@lamp ~]# cat while.sh

  2. #!/bin/bash

  3. while
    true

  4.   do

  1.     uptime

  2.     sleep 2

  3.   done

幸免客户端执行脚本中断的点子。

1、sh while.sh &

2、nohup while.sh &

3、screen保持回话。

ctl+c:为止执行当前剧本或职责

ctrl+z:暂停实施当前剧本或职务

bg:把如今剧本或职分放入后台执行

fg:当前剧本或义务举办前台执行,如若有四个义务,可以fg加职责编号调出

jobs:查看当前推行的台本或职分

进度管理命令

bg:后台运行

fg:挂初阶后

jobs:显示后台程序

kill、killall、pkill:杀掉进程

crontab:设置定时

ps:查看进度

pstree:显示进度情形树

top:突显进程

nice:改变优先权

nohup:用户退出系统今后持续做事

pgrep:查找匹配原则的经过

strace:跟踪一个进度的系统调用情形(strace + pid)

ltrace:跟踪进程调用库函数的景况

vmstat:报告虚拟内存统计音讯

while实现1到100之和。

  1. [root@lamp ~]# cat while_add.sh
  1. #!/bin/bash

  2. i=1

  3. sum=0

  4. while
    [ $i -le 100 ]

  5.   do

  1.     ((sum+=$i))

  2.     ((i++))

  3.   done

  4. echo $sum

专注:在工作中多利用算法,代码执行功效更高。

应用while循环竖向打印10、9、8…

  1. [root@lamp ~]# cat while_seq.sh
  1. #!/bin/bash

  2. i=10

  3. while
    [ $i -gt 0 ]

  4.   do

  1.     echo “$i”

  2.     ((–i))

  3.   done

手机充值10元,每发一回短信费用0.15元,当前余额小于0.15元不可能发短信,指示余额不足,请充值,可以允许用户充值后一而再发短信。

  1. [root@lamp ~]# cat messages.sh
  1. #!/bin/bash

  2. total=0

  3. menu=’

  4. 1:充值

  5. 2:发送音讯

  6. 3:退出

  7. pay(){

  8.   read -t 10 -p “Pls input pay money:” num

  9.   expr ${num} + 1 &>/dev/null

  10.   [ $? -ne 0 ]&&{

  11.     echo “Input error”

  12.     return 1

  13.   }

  14.   if
    [ ${num} -gt 0 ];then

  15.     total=$(( $total + $num * 100 ))

  1.   else
  1.     echo “Input error”

  2.     return 1

  3.   fi

  4. }

  5.  

  6. send(){

  7.   if
    [ ${total} -gt 15 ];then

  8.     echo “send messages is ok.”

  9.     total=$(( $total – 15 ))

  10.   else

  1.     echo “余额不足!”

  2.   fi

  3. }

  4.  

  5. while
    true

  6. do

  1.   echo “当前余额:${total}”

  2.   echo ${menu}

  3.   read -t 10 -p “Pls input a num:” choice

  4.   case
    ${choice} in

  5.     1) pay

  6.     ;;

  7.     2) send

  8.     ;;

  9.     3) exit 0

  10.     ;;

  11.     *)

  12.   esac

  13. done

while按行读取文件的格局。

方式一

  1. exec <FILE

  2. sum=0

  3. while
    read line

  4. do

  1.   cmd

  2. done

方式二

  1. cat ${FILE_PATH} | while read line

  2. do

  1.   cmd

  2. done

方式三

  1. while
    read line

  2. do

  1.   cmd

  2. done<FILE

计量apache一天的日记中所有行的各因素的拜访字节数的总数。

  1. [root@lamp ~]# cat log_cmd.sh
  1. #/bin/bash

  2. exec access.log

  3. while
    read line

  4. do

  1.   i=`echo $line|awk ‘{print $10}’`
  1.   expr $i + 1 &>/dev/null

  2.   if
    [ $? -ne 0 ];then

  3.     continue

  4.   fi

  5.   ((sum+=i))

  6. done

  7. [ -n “$sum” ] && echo $sum

while循环小结。

1、while循环的杀手锏是实践守护进度以及我们希望循环不脱离持续举行的情景,用功用低于1分钟的轮回处理,其余的while循环大概都足以被for循环替代。

2、大致拥有的case语句都得以用if语句替换,一般在系统启动脚本传入少量永恒规则字符串,用case语句,其他一般判断多用if。

3、工作中if和for最常用,其次while(守护进度)和case(服务启动脚本)。

读取一个文书,倒插入一个新的文件,清空原文件。

  1. [root@lamp ~]# cat read_line.sh
  1. #!/bin/bash

  2. file=/root/read.sh

  3. num=`wc -l ${file}|awk -F ‘ ‘ ‘{print
    $1}’`

  4. while
    [ ${num} -gt 0 ]

  5. do

  1.   line=`tail -1 ${file}`

  2.   echo ${line}

  3.   echo
    ${line}>>/root/read_bak.sh

  4.   sed -i ‘$d’ ${file}

  5.   num=`wc -l ${file}|awk -F ‘ ‘
    ‘{print $1}’`

  6. done

1.2.3 【训练题3】批量创造特殊必要用户案例

  批量开立10个系统帐号clsn01-clsn10并设置密码(密码为随机数,要求字符和数字等混合)。

剧本内容:

[root@clsn for2]# cat add_user.sh
#!/bin/bash
#############################################################
# File Name: add_user.sh
# Version: V1.0
# Author: clsn
# Organization:
# Created Time : 2017-12-08 11:52:21
# Description:
#############################################################

Passwd_File=/tmp/`uuidgen`.txt
>$Passwd_File
chmod 400 $Passwd_File

for i in clsn{01..10}
do
userdel -r “$i” &>/dev/null
id $i &>/dev/null
if [ $? -ne 0 ]
then
useradd $i
PassWd=`uuidgen`
echo $PassWd |passwd –stdin $i &>/dev/null
echo “用户名:$i 密码:$PassWd” >>$Passwd_File
echo -e “\033[32m $i 用户创制成功!\033[0m”
else
echo “$i 用户已存在”
fi
if [ “$i” == “clsn10” ]
then
echo “用户密码请查看文件 $Passwd_File”
fi
done
批量创立特殊需要用户

 

 1 [root@clsn for2]# cat add_user.sh 
 2 #!/bin/bash
 3 #############################################################
 4 # File Name: add_user.sh
 5 # Version: V1.0
 6 # Author: clsn
 7 # Organization: http://blog.znix.top
 8 # Created Time : 2017-12-08 11:52:21
 9 # Description:
10 #############################################################
11 
12 Passwd_File=/tmp/`uuidgen`.txt
13 >$Passwd_File
14 chmod 400 $Passwd_File
15 
16 for i in clsn{01..10}
17   do
18    userdel -r "$i" &>/dev/null
19    id $i &>/dev/null
20    if [ $? -ne 0 ]
21      then
22        useradd $i
23        PassWd=`uuidgen`
24        echo $PassWd |passwd --stdin $i &>/dev/null
25        echo "用户名:$i  密码:$PassWd" >>$Passwd_File
26        echo -e "\033[32m $i 用户创建成功!\033[0m"
27    else 
28      echo "$i 用户已存在"
29    fi
30    if [ "$i" == "clsn10" ] 
31      then
32        echo "用户密码请查看文件 $Passwd_File"
33    fi
34 done

 

查看成的密码文件

 

[root@clsn for2]# cat /tmp/3e5c18d9-f878-4d06-931e-5bbcc810c3dc.txt 
用户名:clsn01  密码:3d4644d0-9cf4-49db-8928-1a8346972c32
用户名:clsn02  密码:70798c3a-c8e3-42a0-9942-d4011ce4b4b3
用户名:clsn03  密码:db2a0f1d-2e49-44f5-a5b2-69b352b30120
用户名:clsn04  密码:62d2e0c6-b755-4b00-ad2d-c98f9ca9f258
用户名:clsn05  密码:eaa3471b-d04f-4d7c-8b7e-3d75172a483b
用户名:clsn06  密码:fb260a11-cd47-4b97-ab49-0cae7a755262
用户名:clsn07  密码:16ee7a1f-8aac-4537-b1aa-7fc75beb8754
用户名:clsn08  密码:0dde8823-b97d-4c88-9258-3a68a3b53eba
用户名:clsn09  密码:daf14ec4-ba9f-4593-9773-1557fdf605dc
用户名:clsn10  密码:6f1b452c-00b2-44a1-9f43-5f658d3a9124

 

本子执行进度:

 

上面的事例展现了数组、函数、循环等主题选取。

 澳门金沙国际 6

for循环结构

1.2.3.1  批量创立用户并设置随机密码(不利用shell循环)

  方法一

echo user{1..20}|xargs -n1|sed -r 's#(.*)#useradd \1 \&\& echo \1 >>/tmp/passwd.txt \&\& echo $RANDOM |md5sum |cut -c 1-5>>/tmp/passwd.txt \&\& echo `tail -1 /tmp/passwd.txt`|passwd --stdin \1#g'|bash

  方法二

echo user{1..20}|xargs -n1|sed -r 's#(.*)#useradd \1 \&\& pass=`echo $RANDOM |md5sum |cut -c 1-5` \&\& echo $pass |passwd --stdin \1 \&\& echo \1 $pass>>/tmp/user_passwd.txt#g'|bash

  方法三

echo user{1..20}|xargs -n1|sed -r 's#(.*)#useradd \1 \&\& pass=`echo $RANDOM |md5sum |cut -c 1-5` \&\& echo \1:$pass>>/tmp/user_passwd.txt \&\& chpasswd</tmp/user_passwd.txt#g'|bash

#!/bin/bash

澳门金沙国际 7

for循环结构语法

1、for循环结构

语法

  1. for
    变量名 in 变量取值列表

  2. do

  1.   指令…

  2. done

在此布局中”in 变量取值列表”可粗略,省略时一定于in $@,使用for
i就相当于拔取for i in $@。

2、C语言型for循环结构

语法

  1. for((exp1;exp2;exp3))

  2. do

  1.   指令…

  2. done

for和while对比。

  1. [root@lamp ~]# cat for.sh

  2. #!/bin/bash

  3. for((i=1;i<=5;i++))

  4. do

  1.   echo $i

  2. done

  3.  

  4. [root@lamp ~]# cat while.sh

  5. #!/bin/bash

  6. i=1

  7. while((i<=5))

  8. do

  1.   echo $i

  2.   ((i++))

  3. done

措施一:直接列出元素的法子。

  1. [root@lamp ~]# cat for_02.sh
  1. #!/bin/bash

  2. for i
    in 1 2 3 4 5

  3. do

  1.   echo ssh 192.168.1.${i}

  2. done

  3. [root@lamp ~]# sh for_02.sh

  4. ssh 192.168.1.1

  5. ssh 192.168.1.2

  6. ssh 192.168.1.3

  7. ssh 192.168.1.4

  8. ssh 192.168.1.5

格局二:使用大括号的点子

  1. [root@lamp ~]# cat for_02.sh
  1. #!/bin/bash

  2. for i
    in {1..5}

  3. do

  1.   echo ssh 192.168.1.${i}

  2. done

  3. [root@lamp ~]# sh for_02.sh

  4. ssh 192.168.1.1

  5. ssh 192.168.1.2

  6. ssh 192.168.1.3

  7. ssh 192.168.1.4

  8. ssh 192.168.1.5

主意三:使用命令结果。

  1. [root@lamp ~]# cat for_03.sh
  1. #!/bin/bash

  2. for i
    in `seq 5`

  3. do

  1.   echo ssh 192.168.1.${i}

  2. done

  3. [root@lamp ~]# sh for_03.sh

  4. ssh 192.168.1.1

  5. ssh 192.168.1.2

  6. ssh 192.168.1.3

  7. ssh 192.168.1.4

  8. ssh 192.168.1.5

四位一行突显的优化措施。

  1. [root@lamp ~]# seq 10 >a.log
  1. [root@lamp ~]# cat a.log

  2. 1

  3. 2

  4. 3

  5. 4

  6. 5

  7. 6

  8. 7

  9. 8

  10. 9

  11. 10

  12. [root@lamp ~]# cat a.log|xargs -n4

  1. 1 2 3 4

  2. 5 6 7 8

  3. 9 10

  4. [root@lamp ~]# xargs -n4 <a.log

  1. 1 2 3 4

  2. 5 6 7 8

  3. 9 10

  4. [root@lamp ~]# cat a.log|grep 3

  1. 3

  2. [root@lamp ~]# grep 3 a.log

  3. 3

显示当前路线的装有文件。

  1. [root@lamp ~]# cat for_04.sh
  1. #!/bin/bash

  2. for i
    in `ls`

  3. do

  1.   echo $i

  2. done

批量变更随机文件。

  1. [root@lamp ~]# cat for_05.sh
  1. #!/bin/bash

  2. for((i=1;i<=10;i++))

  3. do

  1.   mkdir -p ./test

  2.   touch ./test/`echo
    $RANDOM|md5sum|cut -c 1-8`_finished.jpg

  3. done

批量化名。

  1. [root@lamp ~]# cat for_06.sh
  1. #!/bin/bash

  2. for i
    in `ls /root/test`

  3. do

  1.   cd /root/test

  2.   mv $i `echo $i|sed
    ‘s#_finished.jpg#.html#g’`

  3. done

 

  1. [root@lamp test]# ls|awk -F ‘[_]’
    ‘{print “mv ” $0,$1″.html”}’|bash

 

  1. [root@lamp test]# rename “_finished.html” “.jpg” *.html

rename “改什么” “改成什么” 对哪个人举行修改

铲除关闭某服务开机自启动。

  1. [root@lamp test]# chkconfig
    –list|grep 3:on|awk ‘{print $1}’|egrep -v “rsyslog|sshd|systat”|sed -r
    ‘s#(.*)#chkconfig \1 off#g’|bash

for实现1+2+3+…+100。

  1. [root@lamp ~]# cat for_07.sh
  1. #!/bin/bash

  2. for
    ((i=1;i<=100;i++))

  3. do

  1.   ((sum+=$i))

  2. done

  3. echo “sum=${sum}”

 

  1. [root@lamp ~]# cat for_08.sh
  1. #!/bin/bash

  2. for i
    in `seq 100`

  3. do

  1.   let sum+=i

  2. done

  3. echo “sum=${sum}”

算法最快。

  1. [root@lamp ~]# echo
    $((100*(100+1)/2))

 

chpasswd批量更新用户口令工具。

确立指令文件passwd.txt(格式为[username:passwd])

# vi passwd.txt

username1:passwd1

username2:passwd2

将passwd.txt的始末传输到chpasswd指令来修改相应用户的密码

# chpasswd < doiido.txt

1.2.4 【磨炼题4】扫描网络内幸存主机案例

  写一个Shell脚本,判断10.0.0.0/24互联网里,当前在线的IP有何?

剧本内容:

[root@clsn for]# cat scan_ip2.sh
#!/bin/bash
#############################################################
# File Name: scan_ip.sh
# Version: V1.0
# Author: clsn
# Organization:
# Created Time : 2017-12-07 21:58:47
# Description:
#############################################################

Ip_File=/tmp/scan_ip.txt
>$Ip_File

for i in 10.0.0.{1..254}
do
ping -c 1 -W 1 $i &>/dev/null && \
if [ $? -eq 0 ] ;then
echo “存活主机: $i” &>>$Ip_File
fi &
done
echo “使用 cat $Ip_File 查看扫描结果”
环视网络内现有主机

 

 1 [root@clsn for]# cat scan_ip2.sh 
 2 #!/bin/bash
 3 #############################################################
 4 # File Name: scan_ip.sh
 5 # Version: V1.0
 6 # Author: clsn
 7 # Organization: http://blog.znix.top
 8 # Created Time : 2017-12-07 21:58:47
 9 # Description:
10 #############################################################
11 
12 Ip_File=/tmp/scan_ip.txt
13 >$Ip_File
14 
15 for i in 10.0.0.{1..254}
16  do
17   ping -c 1 -W 1 $i &>/dev/null && \
18   if [ $? -eq 0 ] ;then 
19     echo "存活主机: $i" &>>$Ip_File
20   fi &   
21 done
22 echo "使用 cat $Ip_File 查看扫描结果"

 

剧本执行结果

 

[root@clsn for]# time sh scan_ip2.sh 
使用 cat /tmp/scan_ip.txt 查看扫描结果

real    0m0.290s
user    0m0.001s
sys    0m0.039s

[root@clsn for]#  cat /tmp/scan_ip.txt
存活主机: 10.0.0.180
存活主机: 10.0.0.254

 

if [[ $# -lt 1 ]]; then
 echo “args count must > 1”
 echo “Uage: bash +x example01.sh [args…]”
 exit
fi

澳门金沙国际 8

break continue exit return对比

break、continue、exit一般用于循环结构中控制循环(for、while、if)的走向。

break n:n表示跳出循环的层数,如果省略n表示跳出整个循环。

continue
n:n表示退到第n层继续循环,若是省略n表示跳过这一次巡回,忽略本次巡回的剩余代码,进入循环的下五次巡回。

exit
n:退出当前shell程序,n为再次来到值。n也得以简简单单,再下一个shell里透过$?接收那几个n值。

return n:用于在函数里,作为函数的重回值,用于判断函数执行是还是不是科学。

  1. [root@lamp ~]# cat for_09.sh
  1. #!/bin/bash

  2. for((i=0;i<=5;i++))

  3. do

  1.   if
    [ $i -eq 3 ];then

  2.   #continue

  3.   #break

  4.   exit

  5.   fi

  6.   echo $i

  7. done

  8. echo “ok”

contine生效

  1. [root@lamp ~]# sh for_09.sh

  2. 0

  3. 1

  4. 2

  5. 4

  6. 5

  7. ok

break生效

  1. [root@lamp ~]# sh for_09.sh

  2. 0

  3. 1

  4. 2

  5. ok

exit生效

  1. [root@lamp ~]# sh for_09.sh

  2. 0

  3. 1

  4. 2

1.2.5 【磨练题5】筛选符合长度的单词案例

  利用bash
for循环打印上边那句话中字母数不大于6的单词(某商店面试真题)。

    I am clsn Welcome to my blog

本子内容:

[root@clsn for]# vim changdu.sh
#!/bin/bash
#############################################################
# File Name: changdu.sh
# Version: V1.0
# Author: clsn
# Organization:
# Created Time : 2017-12-07 22:36:48
# Description:
#############################################################

Word=’I am clsn Welcome to my blog ‘

for i in $Word
do
#[ ${#i} -le 6 ] && echo $i #子串方法
a=`echo $i |wc -L`
if [ $a -le 6 ]
then
echo $i
fi
done
筛选符合长度的单词

 

 1 [root@clsn for]# vim  changdu.sh 
 2 #!/bin/bash
 3 #############################################################
 4 # File Name: changdu.sh
 5 # Version: V1.0
 6 # Author: clsn
 7 # Organization: http://blog.znix.top
 8 # Created Time : 2017-12-07 22:36:48
 9 # Description:
10 #############################################################
11 
12 Word='I am clsn Welcome to my blog http://blog.znix.top'
13 
14 for i in $Word
15  do 
16   #[ ${#i} -le 6 ]  && echo $i  #子串方法
17   a=`echo $i |wc -L`
18   if [ $a -le 6 ]
19     then 
20       echo $i
21    fi
22 done

 

剧本执行结果

 

[root@clsn for]# sh changdu.sh 
I
am
clsn
to
my
blog

 

方法二:

 

read -p "请输入要判断的语句:" a
set -- $a
for i in "$@"
  do
    if [ ${#i} -le 6 ];then
       echo "$i" 
    fi
done

 

 由 https://home.cnblogs.com/u/1233234
  @贰佰  提供

使用expr 总结字符串长度

[root@clsn scripts]# expr length '111'
3

args=$@

3.用seq输出,交给bc命令计算

1.2.6 【操练题6】破解RANDOM随机数案例

  已知上面的字符串是经过RANDOM随机数变量md5sum后,再截取一片段延续字符串的结果,请破解那个字符串对应的选拔md5sum处理前的RANDOM对应的数字?

  21029299
  00205d1c
  a3da1677
  1f6d12dd
  890684b

剧本内容

[root@clsn for]# vim pojie.sh
#!/bin/bash
#############################################################
# File Name: pojie.sh
# Version: V1.0
# Author: clsn
# Organization:
# Created Time : 2017-12-07 22:41:01
# Description:
#############################################################

md5File=/tmp/Randow_Md5.txt
Md5_Word=”21029299 00205d1c a3da1677 1f6d12dd 890684b”

if [ ! -f $md5File ]
then
>$md5File
for i in {0..32767}
do
echo `echo $i |md5sum` $i >> $md5File
done
else
for num in $Md5_Word
do
grep $num $md5File
done
fi
破解RANDOM随机数

 

[root@clsn for]# vim  pojie.sh 
#!/bin/bash
#############################################################
# File Name: pojie.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-07 22:41:01
# Description:
#############################################################

md5File=/tmp/Randow_Md5.txt
Md5_Word="21029299 00205d1c a3da1677 1f6d12dd 890684b"

if [ ! -f $md5File ]
  then
    >$md5File
    for i in {0..32767}
       do
        echo `echo $i |md5sum` $i  >> $md5File
    done
else
    for num in $Md5_Word
      do
       grep $num $md5File
    done
fi

 

本子执行结果

[root@clsn for]# sh  pojie.sh 
2102929901ee1aa769d0f479d7d78b05 - 25667
00205d1cbbeb97738ad5bbdde2a6793d - 1346
a3da1677501d9e4700ed867c5f33538a - 25345
1f6d12dd61b5c7523f038a7b966413d9 - 7041
890684ba3685395c782547daf296935f - 10082

for arg in $args; do
 echo $arg
done

澳门金沙国际 9

1.2.7 【磨练题7】今日头条博文爬虫案例

  获取今日头条(惨绿少年)博客列表倒序排序考试题

需求如下:

  请把

    前年1十二月8日  Shell编程基础篇-下

    

    二〇一七年14月7日   memcached 缓存数据库应用实践

    

高等须求:

  生成html页面,并安装超链接。

  结果如改网页突显:

剧本内容:

 

 1 [root@clsn htmp]# cat clsn_blog.sh 
 2 #!/bin/bash
 3 #############################################################
 4 # File Name: clsn_blog.sh
 5 # Version: V1.0
 6 # Author: clsn
 7 # Organization: http://blog.znix.top
 8 # Created Time : 2017-12-08 21:19:12
 9 # Description:
10 #############################################################
11 
12 Uri='http://www.cnblogs.com/clsn/default.html?page='
13 
14 clsn_Html=/tmp/html/clsn.html
15 mkdir -p /tmp/html/
16 >$clsn_Html
17 
18 for i in {1..6}
19   do
20     curl -s  $Uri$i |grep -A 5  'ImageLink' |sed  's#<.*div.*># #g'|sed 's#--#<br>#g' >> $clsn_Html
21     echo '<br>' >>$clsn_Html
22 done

 

脚本成网页文件

 

function fun() {
 echo $1
}

注:可以测算加减乘除,浮点数,进制转换

1.2.7.1  51CTO博客爬虫案例

本子内容

[root@clsn html]# cat oldboy_blog.sh
#!/bin/bash
#############################################################
# File Name: oldboy_blog.sh
# Version: V1.0
# Author: clsn
# Organization:
# Created Time : 2017-12-08 22:30:57
# Description:
#############################################################

Uri=”
Blog_Index_File=/tmp/html/oldboy_blog.html
mkdir -p /tmp/html
> /tmp/html/oldboy_blog.html

for i in {1..29}
do
curl -s $Uri$i |grep -A 5 ‘发布于’ |\
sed ‘/^.*zan fr.*/,+2d’|\
sed ‘s#^–$#<br>#g’|\
sed ‘s#<a.*fl”>发布于:#<a>#g’|\
sed ‘s#<sp.*an>##g’ >>\
$Blog_Index_File
echo ‘<br>’ >>$Blog_Index_File
done
51CTO博客爬虫

 

 1 [root@clsn html]# cat oldboy_blog.sh 
 2 #!/bin/bash
 3 #############################################################
 4 # File Name: oldboy_blog.sh
 5 # Version: V1.0
 6 # Author: clsn
 7 # Organization: http://blog.znix.top
 8 # Created Time : 2017-12-08 22:30:57
 9 # Description:
10 #############################################################
11 
12 Uri='http://blog.51cto.com/oldboy/p'
13 Blog_Index_File=/tmp/html/oldboy_blog.html
14 mkdir -p /tmp/html
15 > /tmp/html/oldboy_blog.html
16 
17 for i in {1..29}
18   do
19   curl -s $Uri$i |grep -A 5  '发布于'  |\
20        sed '/^.*zan fr.*/,+2d'|\
21        sed 's#^--$#<br>#g'|\
22        sed 's#<a.*fl">发布于:#<a>#g'|\
23        sed 's#<sp.*an>##g' >>\
24            $Blog_Index_File
25   echo '<br>' >>$Blog_Index_File
26 done

 

附 文本编码转码

 

[root@clsn for]# iconv --help
用法: iconv [选项...] [文件...]
转换给定文件的编码。

 输入/输出格式规范:
  -f, --from-code=名称     原始文本编码
  -t, --to-code=名称       输出编码

 信息:
  -l, --list                 列举所有已知的字符集

 输出控制:
  -c                         从输出中忽略无效的字符
  -o, --output=FILE          输出文件
  -s, --silent               关闭警告
      --verbose              打印进度信息

  -?, --help                 给出该系统求助列表
      --usage                给出简要的用法信息
  -V, --version              打印程序版本号

长选项的强制或可选参数对对应的短选项也是强制或可选的

 

常用:

 iconv  -f gb2312  -t utf-8 -c  clsn.html

回到顶部

fun “hello shell”

Echo命令用法总括:

1.3 while循环语句

在编程语言中,while循环(英语:while loop)是一种控制流程的陈述。利用一个返回结果为布林值(Boolean)的表达式作为循环条件,当这个表达式的返回值为“真”(true)时,则反复执行循环体内的程式码;若表达式的返回值为“假”(false),则不再执行循环体内的代码,继续执行循环体下面的代码。

         因为while循环在区块内代码被执行之前,先检查陈述是否成立,因此这种控制流程通常被称为是一种前测试循环(pre-test loop)。相对而言do while循环,是在循环区块执行结束之后,再去检查陈述是否成立,被称为是后测试循环。

 

 

fun2() {
 echo “Linux”
}

echo 选项列表

1.3.1 shell中while语法

while 条件
  do
    命令
done

fun2注意,函数fun中的$1,获取的是函数参数,不是本子调用时传出的参数。$@
是赢得脚本调用时传出的参数列表。

选项

描述

-n

不输出末尾的换行符。

-e

启用反斜线转义。

\b

退格

\\

反斜线

\n

新行

\r

回车

\t

水平制表符

\v

垂直制表符

1.3.2 while 使用情况

         多用于创立守护进程

【示例1】:while完毕web服务器搭建

         脚本代码

 

[root@clsn scripts]# vim web_view.sh 
#!/bin/bash
#############################################################
# File Name: web_view.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-11 10:07:24
# Description:
#############################################################
while true
  do
  echo "ok" | nc -l 81
done

 

  客户端举办访问测试

[root@clsn html]# curl 10.0.0.180:81
ok

  服务端突显结果:

[root@clsn scripts]# sh  web_view.sh 
GET / HTTP/1.1
User-Agent: curl/7.29.0
Host: 10.0.0.180:81
Accept: */*

【示例2】:while创建定时职务

         脚本内容:

#!/bin/bash
while  true
  do
    uptime
       sleep 0.6
done

         脚本实施结果

 

[root@clsn while]# sh  while1.sh 
 15:01:52 up 2 days,  6:02,  3 users,  load average: 0.00, 0.01, 0.05
 15:01:53 up 2 days,  6:02,  3 users,  load average: 0.00, 0.01, 0.05
 15:01:53 up 2 days,  6:02,  3 users,  load average: 0.00, 0.01, 0.05
 15:01:54 up 2 days,  6:02,  3 users,  load average: 0.00, 0.01, 0.05
 15:01:55 up 2 days,  6:02,  3 users,  load average: 0.00, 0.01, 0.05
 15:01:55 up 2 days,  6:02,  3 users,  load average: 0.00, 0.01, 0.05

 

说明:

         sleep 与 usleep

sleep 单位 秒  sleep 1 休息1秒

usleep 单位 微秒 usleep 1000000 休息1s

1阿秒等于百格外之一秒(10的负6次方秒)

时刻测试

[root@clsn while]# time sleep 0.1

real    0m0.102s
user    0m0.001s
sys    0m0.000s

3).while 循环以及其余两种循环、case、表明式expr的利用

澳门金沙国际 10

1.3.3 while 作用

  补充定时职务成效,执行小于1秒的定时职责

  循环执行某些操作,例如水果菜单

              (1.3.6)

示范1:使用while循环完成水果菜单的重复使用  

         脚本内容

1 使用while循环实现水果菜单的重复使用

         脚本实施进程

 

示例2:计算1-100的和

  方法一 (bc命令完结)

echo `seq -s + 1 100`|bc

  方法二(while循环方法)

 

[root@clsn while]# cat jishan.sh 
#!/bin/bash
#############################################################
# File Name: jishan.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-09 15:18:44
# Description:
#############################################################

i=1

while [ "$i" -le 100 ]
  do
  ((b=b+i))
  ((i++))
done
echo $b

 

以身作则3:完毕类似手机通信计费效用

         脚本内容:

 

 1 [root@clsn scripts]# cat while/shouji.sh 
 2 #!/bin/bash
 3 #############################################################
 4 # File Name: shouji.sh
 5 # Version: V1.0
 6 # Author: clsn
 7 # Organization: http://blog.znix.top
 8 # Created Time : 2017-12-09 15:56:09
 9 # Description:
10 #############################################################
11 sum=1000
12 i=15
13 
14 
15 while [ $sum -ge 15 ]
16   do
17 cat<<EOF
18 =================
19 1.发短信
20 2.查余额
21 3.账户充值
22 4.退出
23 =================
24 EOF
25     read -p "你要做什么呢?" Some
26     case "$Some" in
27       1)
28         sum=$((sum-i))
29         read -p  "请输入发送短信的内容:"
30         read -p  "请输入收信人:"
31         sleep 0.3
32         echo "发送成功."
33         echo "您当前余额为$sum"
34         ;;
35       2)
36         echo "您当前余额为$sum"
37         ;;
38       3)
39         read -p "请输入你要充值的金额:" ChongZhi
40         sum=$((sum+ChongZhi))
41         echo "充值成功,当前余额为$sum"
42         ;;
43       4)
44         exit
45         ;;
46       *)
47         echo "输入有误!"
48         exit 2
49     esac
50 done
51 
52 echo "余额不足,请及时充值!"

 

回到顶部

#!/bin/bash

澳门金沙国际 11

1.4 获取取文件中的行,单词和字符

if [[ $# -lt 1 ]]; then
        echo “args count must > 1”
        echo “Uage: bash +x example01.sh [args…]”
        exit
fi

注:echo-e启用转义字符反斜线的编译器,上边命令启用-e 
\t突显为水平制表符

1.4.1 迭代获取文件中的每一行

方法一

while read line;
  do 
    echo $line;
done < file.txt

方法二

cat file.txt|while read line
  do
echo $line
done

方法三

exec < file.txt
while read line;
  do
    echo line;
done

case $1 in
        “install” )
                echo “operation type is install”
        ;;
        “uninstall” )
                echo “operation type is uninstall”
        ;;
        * )
                echo “operation type is not support”
        ;;
esac

澳门金沙国际 12

1.4.2 迭代获取每一个单词

for word in $line;
  do
    echo $word;
done 

for ((i=0;i<3;i++))
do
        if ((i==1))
        then
                continue
        fi
        echo $i
done

注:echo-e启用转义字符反斜线的编译器,上面命令启用-e 
\v彰显为垂直制表符

1.4.3 迭代获取每一个字符

word=participate
for ((i=0;i<${#word};i++))
  do
    echo  ${word:1:1};
done

for i in `seq 5`
do
        echo “loop $i”
done

澳门金沙国际 13

1.4.4 同时取得取文件中的行,单词和字符脚本

剧本内容

 

#!/bin/bash
n=1
while read i
  do
   echo "第${n}行 $i"
   m=1
   for x in $i
     do
       echo "第${m}个单词 $x"
       echo $x|grep -o . 
       ((m++))
   done
   ((n++))
done < $1

 

本子执行结果:

[root@clsn scripts]# sh lunxun.sh /etc/hosts
第1行 127.0.0.1 localhost localhost.localdomain localhost4
localhost4.localdomain4
第1个单词 127.0.0.1
1
2
7
.
0
.
0
.
1
第2个单词 localhost
l
o
c
a
l
h
o
s
t
第3个单词 localhost.localdomain
l
o
c
a
l
h
o
s
t
.
l
o
c
a
l
d
o
m
a
i
n
第4个单词 localhost4
l
o
c
a
l
h
o
s
t
4
第5个单词 localhost4.localdomain4
l
o
c
a
l
h
o
s
t
4
.
l
o
c
a
l
d
o
m
a
i
n
4
第2行 ::1 localhost localhost.localdomain localhost6
localhost6.localdomain6
第1个单词 ::1
:
:
1
第2个单词 localhost
l
o
c
a
l
h
o
s
t
第3个单词 localhost.localdomain
l
o
c
a
l
h
o
s
t
.
l
o
c
a
l
d
o
m
a
i
n
第4个单词 localhost6
l
o
c
a
l
h
o
s
t
6
第5个单词 localhost6.localdomain6
l
o
c
a
l
h
o
s
t
6
.
l
o
c
a
l
d
o
m
a
i
n
6
第3行 10.0.0.1 mirrors.aliyuncs.com mirrors.aliyun.com
第1个单词 10.0.0.1
1
0
.
0
.
0
.
1
第2个单词 mirrors.aliyuncs.com
m
i
r
r
o
r
s
.
a
l
i
y
u
n
c
s
.
c
o
m
第3个单词 mirrors.aliyun.com
m
i
r
r
o
r
s
.
a
l
i
y
u
n
.
c
o
m
第4行 10.0.0.180 clsn
第1个单词 10.0.0.180
1
0
.
0
.
0
.
1
8
0
第2个单词 clsn
c
l
s
n
1.4.4 同时得到取文件中的行,单词和字符脚本 执行结果

 

  1 [root@clsn scripts]# sh  lunxun.sh  /etc/hosts
  2 第1行 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
  3 第1个单词 127.0.0.1
  4 1
  5 2
  6 7
  7 .
  8 0
  9 .
 10 0
 11 .
 12 1
 13 第2个单词 localhost
 14 l
 15 o
 16 c
 17 a
 18 l
 19 h
 20 o
 21 s
 22 t
 23 第3个单词 localhost.localdomain
 24 l
 25 o
 26 c
 27 a
 28 l
 29 h
 30 o
 31 s
 32 t
 33 .
 34 l
 35 o
 36 c
 37 a
 38 l
 39 d
 40 o
 41 m
 42 a
 43 i
 44 n
 45 第4个单词 localhost4
 46 l
 47 o
 48 c
 49 a
 50 l
 51 h
 52 o
 53 s
 54 t
 55 4
 56 第5个单词 localhost4.localdomain4
 57 l
 58 o
 59 c
 60 a
 61 l
 62 h
 63 o
 64 s
 65 t
 66 4
 67 .
 68 l
 69 o
 70 c
 71 a
 72 l
 73 d
 74 o
 75 m
 76 a
 77 i
 78 n
 79 4
 80 第2行 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
 81 第1个单词 ::1
 82 :
 83 :
 84 1
 85 第2个单词 localhost
 86 l
 87 o
 88 c
 89 a
 90 l
 91 h
 92 o
 93 s
 94 t
 95 第3个单词 localhost.localdomain
 96 l
 97 o
 98 c
 99 a
100 l
101 h
102 o
103 s
104 t
105 .
106 l
107 o
108 c
109 a
110 l
111 d
112 o
113 m
114 a
115 i
116 n
117 第4个单词 localhost6
118 l
119 o
120 c
121 a
122 l
123 h
124 o
125 s
126 t
127 6
128 第5个单词 localhost6.localdomain6
129 l
130 o
131 c
132 a
133 l
134 h
135 o
136 s
137 t
138 6
139 .
140 l
141 o
142 c
143 a
144 l
145 d
146 o
147 m
148 a
149 i
150 n
151 6
152 第3行 10.0.0.1 mirrors.aliyuncs.com mirrors.aliyun.com
153 第1个单词 10.0.0.1
154 1
155 0
156 .
157 0
158 .
159 0
160 .
161 1
162 第2个单词 mirrors.aliyuncs.com
163 m
164 i
165 r
166 r
167 o
168 r
169 s
170 .
171 a
172 l
173 i
174 y
175 u
176 n
177 c
178 s
179 .
180 c
181 o
182 m
183 第3个单词 mirrors.aliyun.com
184 m
185 i
186 r
187 r
188 o
189 r
190 s
191 .
192 a
193 l
194 i
195 y
196 u
197 n
198 .
199 c
200 o
201 m
202 第4行 10.0.0.180 clsn
203 第1个单词 10.0.0.180
204 1
205 0
206 .
207 0
208 .
209 0
210 .
211 1
212 8
213 0
214 第2个单词 clsn
215 c
216 l
217 s
218 n

 

留神那里的case * 并不是持有,而是输入值不在case中,相当于default.
在循环中可以应用continue/break等根本字,卓殊相近java等其它语言的大循环。

注:echo-e启用转义字符反斜线的编译器,上边命令启用-e  \n\t突显效果

1.4.5 eval 命令用法

[root@clsn ~]# clsn=6
[root@clsn ~]# echo {1..$clsn}
{1..6}
[root@clsn ~]# eval echo {1..$clsn}
1 2 3 4 5 6

   eval 命令的印证

 

[root@clsn ~]# help eval
eval: eval [参数 ...]
    将参数作为 shell 命令执行。

    将 ARGs 合成一个字符串,用结果作为 shell 的输入,
    并且执行得到的命令。

    退出状态:
    以命令的状态退出,或者在命令为空的情况下返回成功。

 

回去顶部

4).脚本之间交互引用

澳门金沙国际 14

1.5 break continue exit return

标准与循环控制及程序重临值命令表 

命令

说明

break n   

如果省略n,则表示跳出整个循环,n表示跳出循环的层数

continue n

如果省略n,则表示跳过本次循环,忽略本次循环的剩余代码,进人循环的下一次循环。 n表示退到第n层继续循环

exit n

退出当前Shell程序,n为上一次程序执行的状态返回值。n也可以省略,在下一个Shell里可通过"$?"接收exit n的n值

return n

用于在函数里作为函数的返回值,以判断函数执行是否正确。在下一个Shell里可通过"$?"接收exit n的n值

简单来说即:
break    跳出循环
continue 跳出本次循环
exit     退出脚本
return   与 exit 相同,在函数中使用

因此source 或者 . 的法子得以引用另一个剧本中的函数或者变量

Echo命令和大括号混合使用方式

1.5.1 break命令表达

 

[root@clsn scripts]# help break 
break: break [n]
    退出 for、while、或 until 循环

    退出一个 FOR、WHILE 或 UNTIL 循环。如果指定了N,则打破N重
    循环

    退出状态:
    退出状态为0除非 N 不大于或等于 1。

 

  测试脚本内容

#!/bin/bash

for i in {1..5}

do

if [ $i -eq 3 ]

then

break

fi

echo $i

done

echo “ok”
break 测试脚本

 

 1 #!/bin/bash
 2 
 3 for i in {1..5}
 4 
 5   do
 6 
 7     if [ $i -eq 3 ]
 8 
 9       then
10 
11        break
12 
13     fi
14 
15     echo $i
16 
17 done
18 
19 echo "ok"

 

  脚本实施结果

[root@clsn scripts]# sh break.sh 
    1
    2
    ok

first.sh

澳门金沙国际 15

1.5.2 continue命令表明

 

[root@clsn scripts]# help continue 
continue: continue [n]
    继续 for、while、或 until 循环。

    继续当前 FOR、WHILE 或 UNTIL 循环的下一步。
    如果指定了 N, 则继续当前的第 N 重循环。

    退出状态:
    退出状态为 0 除非 N 不大于或等于1。

 

  测试脚本内容

#!/bin/bash
for i in {1..5}
do
if [ $i -eq 3 ]
then
continue
fi
echo $i
done
echo “ok”
continue 测试脚本

 

 1 #!/bin/bash
 2     for i in {1..5}
 3       do
 4         if [ $i -eq 3 ]
 5           then 
 6             continue
 7         fi
 8         echo $i
 9     done
10     echo "ok"

 

  脚本实施结果

[root@clsn scripts]# sh continue.sh 
1
2
4
5
ok

function fun(){
 echo “i am from first.”
}

curl命令用法总括:

1.5.3 exit命令表明

[root@clsn scripts]# help exit
exit: exit [n]
    退出shell。

    以状态 N 退出 shell。  如果 N 被省略,则退出状态
    为最后一个执行的命令的退出状态。

  测试脚本内容

#!/bin/bash
for i in {1..5}
do
if [ $i -eq 3 ]
then
exit
fi
echo $i
done
echo “ok”
exit 测试脚本

 

 1     #!/bin/bash
 2     for i in {1..5}
 3       do
 4         if [ $i -eq 3 ]
 5           then 
 6             exit
 7         fi
 8         echo $i
 9     done
10     echo "ok"

 

  脚本实施结果

    [root@clsn scripts]# sh exit.sh 
    1
    2

file=firstsecond.sh

curl的选项功效:

1.5.4 return命令表明

 

[root@clsn tuichu]# help return 
return: return [n]
    从一个 shell 函数返回。

    使一个函数或者被引用的脚本以指定的返回值 N 退出。
    如果 N 被省略,则返回状态就是
    函数或脚本中的最后一个执行的命令的状态。

    退出状态:
    返回 N,或者如果 shell 不在执行一个函数或引用脚本时,失败。

 

回去顶部

. first.sh
fun

不带任何参数时 curl 将回来指定url中的数据并打印在显示屏上

1.6 shell中的数组

echo $file
行使bash +x second.sh执行,在second.sh 中可以调用fun函数和采用file变量。

-u 使用用户名和密码登陆。如curl -uname:passwd URL

1.6.1 为何会暴发Shell数组

  平常在支付Shell脚本时,定义变量选取的花样为“a=l;b=2;C=3”,可倘若有七个变量呢?那时再逐个地定义就会很费力,并且只要有多少个不确定的变量内容,也会难以
举行变量定义,其它,快捷读取不一样变量的值也是一件很惨痛的事体,于是数组就诞生
了,它就是为着化解上述难点而产出的。

此处的.和source都落实引用first文件中的变量。注意:
若是还要引述了多个剧本的同一个变量名的变量,后面的值会覆盖前面的变量而不会报错。
5).关于错误处理

-b/–cookie  <name=data>  
向服务器交由cookie,若无=则name视为文件名,例如:curl -b cookie.txt
www.jbxue.com

1.6.2 什么是Shell数组

  Shell的数组就是一个因素集合,它把个别个要素(变量或字符内容)用一个名字来
命名,然后用数码对它们举办区分。那些名字就叫做数组名,用于区分分裂内容的编
号就称为数组下标。组成数组的逐一要素(变量)称为数组的因素,有时也称为下标变量。

a)在shell中有一个变量 $?
,那个变量记录的是上次剧本执行的结果,假使正常为止则是0,否则是非0值;

-o out 
将指定curl重回保存为out文件,内容从html/jpg到各样MIME类型文件。如curl -o
page.html URL

1.6.3 数组中的增删改查

数组的概念

 

# 定义数组
[root@clsn scripts]# stu=(001 002 003)
# 打印数组
[root@clsn scripts]# echo ${stu[@]}
001 002 003
# 显示数组长度
[root@clsn scripts]# echo ${#stu}
3

 

*查: **遍历数组的内容*

 

# 打印数组内容(通过数组下标或索引)
[root@clsn scripts]# echo ${stu[0]}
001
[root@clsn scripts]# echo ${stu[1]}
002
[root@clsn scripts]# echo ${stu[2]}
003
[root@clsn scripts]# echo ${stu[3]}

# 遍历数组
  方法一
[root@clsn scripts]# for i in ${stu[@]};do echo $i ;done 
001
002
003
    # 方法二
[root@clsn scripts]# array=(1 2 3 4 5)
[root@clsn scripts]# for i in `eval echo {1..${#array[@]}}`;do echo ${array[i-1]};done
1
2
3
4
5

 

*增**:数组添加*

[root@clsn scripts]# stu[3]=004
[root@clsn scripts]# echo ${stu[@]}
001 002 003 004

数组修改

[root@clsn scripts]# stu[2]=000
[root@clsn scripts]# echo ${stu[@]}
001 002 000 004

数组删除

[root@clsn scripts]# unset stu[2]
[root@clsn scripts]# echo ${#stu[@]}
3
[root@clsn scripts]# echo ${stu[@]}
001 002 004

b)假若在shell脚本中通过set -o
errexit来促成遭受错误就淡出,那样可以防止发生越多的不当;

-d <key=value>  向服务器POST表单数据 例如:curl -d
“order=111&count=2”

1.6.4 将指令的结果赋值给数组

dir=(`ls`)
dir=($(ls))

命令定义数组

 

[root@clsn scripts]# COM=(`ls`)
[root@clsn scripts]# echo ${COM[@]}
bianliang.sh case cfb.sh chanshu.sh check check_url.sh 
clsn.sh clsn_test.sh daojishi.sh ddos_check.sh echo.sh for for2 fruits.sh
function fz.sh html jingdutiao.sh jishuanqi2.sh jishuanqi.sh lamp.sh lnmp.sh 
memcache_check.sh menu.sh nginx.sh panduan panduan1 play quanju.sh rsync_check.sh 
rsyncd system6 tuichu web_check.sh web_view.sh while xiugaizhuji.sh yhk.sh yunshuan.sh 
zhuajiu.sh

 

c)在shell执行进程中如若出错,可以透过重定向的措施,输出到文件中,比如Command
>> filename2>&1

-A/–user-agent  <ua>  指定发送请求的用户代理,例如:curl -A
My-Agent/1.0.0 www.jbxue.com 

1.6.1 数组定义格式

 

[root@clsn scripts]# a=(1 2 3 )
[root@clsn scripts]# b=(1
> 2
> 3
> 4
> )
[root@clsn scripts]# echo ${a[@]}
1 2 3
[root@clsn scripts]# echo ${b[@]}
1 2 3 4

 

6).字典

-x  ip:port 指定使用的http代理,例如:curl -x 192.168.1.1:8080
www.jbxue.com

1.6.2 数组的本质就是一个变量,只是那个变量存了三个值

在shell 常用的意义是查

   array=(valuel value2 value3 …)

打印数组格式

${array[@]} 所有元素
${#array[@]}  数组长度
${array[i]}  单个元素,i是下标

shell中的字典是不行好的数据结构,可以很有益地处理配置

-D head.txt 
将服务器的归来的header保存为文件,底部的cookie也可被封存,例如:curl -D
header.txt www.jbxue.com  

1.6.3 【磨炼题】批量反省三个网站地址是否正常

要求:

  1、选择shell数组方法达成,检测策略尽量模拟用户访问。

  2、每10分钟做四次具有的检测,无法访问的输出报警。

  3、待检测的地点如下

    

    

    

    

剧本内容:

[root@clsn scripts]# cat check_url.sh
#!/bin/bash
#############################################################
# File Name: check_url.sh
# Version: V1.3
# Author: clsn
# Organization:
# Created Time : 2017-12-12 10:44:39
# Description:
#############################################################
url=(

)
while true
do
for i in ${url[@]}
do
#curl $i &>/dev/null
a=$(curl -I -w “%{http_code}\n” -o /dev/null -s $i)
if [ $a -ne 200 ]
then
echo “$url 异常”
fi
done
sleep 10
done
批量反省七个网站地址是还是不是正常

 

 1 [root@clsn scripts]# cat check_url.sh 
 2 #!/bin/bash
 3 #############################################################
 4 # File Name: check_url.sh
 5 # Version: V1.3
 6 # Author: clsn
 7 # Organization: http://blog.znix.top
 8 # Created Time : 2017-12-12 10:44:39
 9 # Description:
10 #############################################################
11 url=(
12 http://www.cnblogs.com/clsn/
13 http://blog.znix.top
14 http://blog.nmtui.com
15 http://10.0.0.7
16 )
17 while true 
18   do
19     for i in ${url[@]} 
20       do 
21       #curl $i &>/dev/null
22       a=$(curl -I -w "%{http_code}\n" -o /dev/null -s $i)
23       if [ $a -ne 200 ]
24         then
25           echo "$url 异常"
26       fi
27     done
28     sleep 10
29 done

 

回去顶部

#!/bin/bash

假诺希望从本地文件中得到表单数据,则在文件名前加@ ,例如:curl -d
@data.xml

1.7 Shell 函数

  shell一个分外首要的特征是它可用作一种编程语言来行使。因为shell是一个解释器,所以它不可以对为它编写的次序举办编译,而是在每一遍从磁盘加载那一个程序时对它们举行分解。而先后的加载妥协说都是老大耗时的。

   针对此难点,许多shell(如BourneAgainShell)都包括shell函数,shell把这几个函数放在内存中,那样每一趟要求实施它们时就不要再从磁盘读入。shell还以一种内部格式来存放那个函数,那样就无须费用大量的时光来解释它们。

         函数的功用即便把程序里屡屡调用相同代码的一对概念成一份,然后起个名字,所有的调用都
只用这名字就可以了,修改代码时,只须要改变函数体内的代码即可。

set -o errexit

若希望从正规输入获取则用 curl -d “name=username&passwd=pwd”

1.7.1 使用函数的优势

    把相同的程序段定义成函数,可以减掉代码量。

    增加程序的可读、易读性

    完毕程序功用的模块化

hput(){
 eval “hkey_$1″=”$2”
}

-L 当页面有跳转的时候,输出跳转到的页面

1.7.2 定义函数

 

function clsn(){
    echo "http://blog.znix.top"
}

znix(){
    echo "http://www.znix.top " 
}

 

说明:

  1、可以带function clsn() 定义,也可以直接clsn() 定义,不带任何参数。

  2、参数重临,可以来得加:return
重临,若是不加,将以最终一条命令运行结果,作为重回值。
return后跟数值n(0-255)

  3、执行函数就是将函数名放到定义的函数之后即可

将函数加载到当前窗口进行:

 

[root@clsn function]# . fun1.sh 
[root@clsn function]# zn
znew  znix  
[root@clsn function]# znix 
test
[root@clsn function]# clsn 
http://blog.znix.top

 

hget(){
 eval echo ‘${‘”hkey_$1″‘}’
}

-I  header新闻  当有跳转时,可以经过 curl -L -I URL|grep Location
来确定跳转到的新url地址

1.7.3 引用函数

剧本内容

 

[root@clsn function]# cat  fun2.sh 
#!/bin/bash
#############################################################
# File Name: fun2.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-11 19:25:56
# Description:
#############################################################
Fun_File=/server/scripts/function/fun1.sh
[ -f $Fun_File ] && . $Fun_File
clsn

 

本子执行结果

[root@clsn function]# sh  fun2.sh
http://blog.znix.top

hput k1 v1
hget k1

-c <file>保存服务器的cookie文件

1.7.4 函数传参

剧本内容:

 

[root@clsn function]# cat fun3.sh 
#!/bin/bash
#############################################################
# File Name: fun3.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-12 09:38:48
# Description:
#############################################################

function clsn(){
    echo "Hi "
}
CLSN(){
    echo "Hello "
    echo  $0
    echo  $1
    echo  $2

}
clsn
CLSN xi  xi 

 

本子执行结果

[root@clsn function]# sh fun3.sh 
Hi 
Hello 
fun3.sh
xi
xi

declare -A dic

-e url  设置引用头的值

1.7.5 $0 永远的本子名称

 

function clsn(){
    echo "http://blog.znix.top $1 $2"
    echo $0
}

znix(){
    echo "test" 
}
clsn $1 $2

 

实施结果

[root@clsn function]# sh  fun1.sh 
http://blog.znix.top  
fun1.sh

dic=([key1]=”value1″ [key2]=”value2″ [key3]=”value3″)

-T localfile  向服务器PUT文件 例如:curl -T 1.mp4 
www.jbxue.com/upload.php

1.7.6 函数中return的用法

本子内容:

 

[root@clsn function]# cat  fun3.sh 
#!/bin/bash
#############################################################
# File Name: fun3.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-12 09:38:48
# Description:
#############################################################

function clsn(){
    echo "Hi "
}
CLSN(){
    echo "Hello "
    echo  $0
    echo  $1
    echo  $2
    return 4
    echo "xxixiixxiix"

}
clsn
CLSN xi  xi 
echo $?

 

本子执行结果

 

[root@clsn function]# sh fun3.sh
Hi 
Hello 
fun3.sh
xi
xi
4

 

return命令表明:

 

[root@clsn function]# help return 
return: return [n]
    从一个 shell 函数返回。

    使一个函数或者被引用的脚本以指定的返回值 N 退出。
    如果 N 被省略,则返回状态就是
    函数或脚本中的最后一个执行的命令的状态。

    退出状态:
    返回 N,或者如果 shell 不在执行一个函数或引用脚本时,失败。

 

echo ${dic[“key1”]}
# output all key
echo ${!dic[*]}
#outpull all value
echo ${dic[*]}
# access all
for key in $(echo ${!dic[*]})
do
        echo “$key : ${dic[$key]}”
done
实践之后,输出如下:

-F <key=value>向服务器POST表单,例如:curl -F
“web=@index.html;type=text/html” url.com

1.7.7 自定义常用函数库

#!/bin/bash
#############################################################
# File Name: /server/scripts/userfun.sh
# Version: V1.0
# Author: clsn
# Organization:
# Created Time : 2017-12-12 10:40:04
# Description:
#############################################################

# 脚本初阶化
function scripts_init(){
prog=`basename $0 .sh`
LockFile=/var/lock/subsys/${prog}.lock # 使用锁文件
LogFile=/var/log/${prog}.log # 脚本记录日志
PidFile=/var/run/${prog}.pid # 记录进度号,可以管理脚本

[ -f $LockFile ] && echo “There $LockFile is exist!!” && exit 1
||touch $LockFile
[ ! -f $LogFile ] && touch $LogFile
[ -f $PidFile ] && echo “There $PidFile is exist!!” && exit 2|| echo
$$ > $PidFile
}

# 记录日志
function writelog(){
Date=$(date “+%F_%T”)
ShellName=`basename $0`
Info=$1
echo “$Date : ${ShellName} : ${Info}” >> ${LogFile}
}

# 脚本退出扫尾
function closeout(){
[ -f $LockFile ] && rm -f $LockFile
[ -f $PidFile ]&& rm -f $PidFile
}

# 判断输入是整数
function int_judge(){
fun_a=$1
expr $fun_a + 1 &>/dev/null
RETVAL=$?
return $RETVAL
}

# 判断输入非空
function input_judge(){
RETVAL=0
fun_a=$1
[ ${#fun_a} -eq 0 ]&& RETVAL=1
return $RETVAL
}
自定义函数库脚本

 

 1 #!/bin/bash
 2 #############################################################
 3 # File Name: /server/scripts/userfun.sh
 4 # Version: V1.0
 5 # Author: clsn
 6 # Organization: http://blog.znix.top
 7 # Created Time : 2017-12-12 10:40:04
 8 # Description:
 9 #############################################################
10 
11 # 脚本初始化
12 function scripts_init(){
13   prog=`basename $0 .sh`
14   LockFile=/var/lock/subsys/${prog}.lock  # 使用锁文件
15   LogFile=/var/log/${prog}.log  # 脚本记录日志
16   PidFile=/var/run/${prog}.pid  # 记录进程号,可以管理脚本
17 
18   [ -f $LockFile ] && echo "There $LockFile is exist!!" && exit 1 ||touch $LockFile
19   [ ! -f $LogFile ] && touch $LogFile
20   [ -f $PidFile ] && echo "There $PidFile is exist!!" && exit 2|| echo $$ > $PidFile
21 }
22 
23 # 记录日志
24 function writelog(){
25   Date=$(date "+%F_%T")
26   ShellName=`basename $0`
27   Info=$1
28   echo "$Date : ${ShellName} : ${Info}" >> ${LogFile}
29 }
30 
31 # 脚本退出扫尾
32 function closeout(){
33   [ -f $LockFile ] && rm -f $LockFile 
34   [ -f $PidFile ]&& rm -f $PidFile
35 }
36 
37 # 判断输入是整数
38 function int_judge(){
39   fun_a=$1
40   expr $fun_a + 1 &>/dev/null
41   RETVAL=$?
42   return $RETVAL
43 }
44 
45 # 判断输入非空
46 function input_judge(){
47   RETVAL=0
48   fun_a=$1
49   [ ${#fun_a} -eq 0 ]&& RETVAL=1
50   return $RETVAL
51 }

 

basename命令

         取出文件名称

[root@clsn function]# basename /server/scripts/zhuajiu.sh 
zhuajiu.sh
[root@clsn function]# basename /server/scripts/zhuajiu.sh  .sh 
zhuajiu

$$ 参数

         取出脚本运行时的pid, 脚本运行的此时此刻进程ID号

[root@clsn function]# echo $$
37208
[root@clsn function]# ps -ef |grep 37208
root      37208  37206  0 08:39 pts/0    00:00:00 -bash
root      38578  37208  1 10:33 pts/0    00:00:00 ps -ef
root      38579  37208  0 10:33 pts/0    00:00:00 grep --color=auto 37208

引用自定义函数库示例:

 

[root@clsn function]# head -22  fun3.sh 
#!/bin/bash
#############################################################
# File Name: fun3.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-12 09:38:48
# Description:
#############################################################

. /server/scripts/userfun.sh

scripts_init 
i=1
while ((i<=10))
  do 
   uptime
   ((i++))
   sleep 1
done
closeout

 

回去顶部

v1
value1
key3 key2 key1
value3 value2 value1
key3 : value3
key2 : value2
key1 : value1
7).文本甩卖

-E cert.pem  指定地点证书

1.8 shell脚本的调剂

sed 命令可以对对文本举办操作。

-H <header:value>  为HTTP请求设置任意header及值。如curl -H
“Connection:keep-alive”

1.8.1 脚本调试技巧

  调试技巧1:使用dos2unix处理脚本

从windows编辑的脚本到Linux下需要使用这个命令
dos2unix windows.sh

  调试技巧2:使用echo命令调试

在变量读取或修改的前后加入echo $变量,也可在后面使用exit退出脚本,这样可以不用注释后面的代码

  调试技巧3:sh -x 脚本  ==》全局调试

sh -x  scripts.sh

  调试技巧4:局地调试

set -x
要调试的脚本内容
set +x

比如说有一个文本sedfile,内容如下:

-X/–request method 用户定义的HTTP请求方法名如 curl -X GET www.baidu.com

1.8.2 Shell调试技巧总括

  ①要记得第一用dos2unix对台本格式化。

  ②一贯实施脚本根据报错来调节,有时报错不可信。

  ③sh -x调试整个脚本,彰显执行进度。

  ④set -x和set +x调试部分脚本(在本子中安装)

  ⑤echo输出变量及相关内容,然后紧跟着exit退出,不履行前面程序的艺术,一步步跟踪脚本,对于逻辑错误比较好用。

       写法: echo $var;exit 

  ⑥最要害的是语法熟知、编码习惯、编程思想,将错误扼杀在萌芽之中,减轻调试负担,进步功能。

回来顶部

1
2
3
4
5进行 “sed ‘1,3d’ sedfile,则会输出4,5
两行,即对1,2,3行做了去除处理,注意那时文件之中并没有删掉那两行。

–compressed 拔取压缩格局收取再次来到数据

1.9 shell编程练习题

除去剔除之外,仍能做替换操作。

–connect-timeout <s>设置超时时间

1.9.1 【磨练题1】shell完结抓阄程序

急需接纳shell编写一个抓阄的主次:

要求:

  1、执行脚本后,输入英文名字全拼,爆发随机数01-99里面的数字,数字越大评分就去高,前边已经抓到的数字,下次不可以在出现同等数字。

  2、首个输入名字后,屏幕输出音信,并将名字和数字记录到文件里,程序不能脱离继续守候别人输入。

         脚本内容:

[root@clsn scripts]# cat zhuajiu.sh
#!/bin/bash
#############################################################
# File Name: zhuajiu.sh
# Version: V1.0
# Author: clsn
# Organization:
# Created Time : 2017-12-10 15:21:27
# Description:
#############################################################
Randow_Temp=/tmp/randow.test
name_Out_File1=/tmp/name_Out_File1.test
name_Out_File2=/tmp/name_Out_File2.test

>$name_Out_File1
>$name_Out_File2
>$Randow_Temp

trap ‘echo “请勿使用 Ctrl+c”‘ 2

Randow() {
sum=`echo $RANDOM |cut -c-2`
grep $sum $Randow_Temp
if [ $? -eq 0 ];then
Randow
else
echo $sum >>$Randow_Temp
daxiao=$sum
fi
}

Print() {
read -p “请输入名字的拼音:” Name
Randow
echo $Name $daxiao >>$name_Out_File
}

while true
do
clear
echo “”
echo -e “\033[32m
那么些程序会将轻易数字名次前三的同桌显示出来!\033[0m”
echo -e “\033[31m 退出脚本请使用 ‘exit’ \033[0m”
echo “”
head -4 $name_Out_File2
read -p “请输入名字的拼音:” “Name”
if [ “$Name” == exit ]
then
exit
fi
Randow
echo $daxiao $Name >>$name_Out_File1
echo “随机数最大的三位同学是:” >$name_Out_File2
sort -k1 -r $name_Out_File1 |column -t >>$name_Out_File2
clear
done
抓阄程序 脚本

 

 1 [root@clsn scripts]# cat zhuajiu.sh 
 2 #!/bin/bash
 3 #############################################################
 4 # File Name: zhuajiu.sh
 5 # Version: V1.0
 6 # Author: clsn
 7 # Organization: http://blog.znix.top
 8 # Created Time : 2017-12-10 15:21:27
 9 # Description:
10 #############################################################
11 Randow_Temp=/tmp/randow.test
12 name_Out_File1=/tmp/name_Out_File1.test
13 name_Out_File2=/tmp/name_Out_File2.test
14 
15 >$name_Out_File1
16 >$name_Out_File2
17 >$Randow_Temp
18 
19 trap 'echo "请勿使用 Ctrl+c"' 2
20 
21 Randow() {
22     sum=`echo $RANDOM |cut -c-2`
23     grep $sum  $Randow_Temp
24     if [ $? -eq 0 ];then
25       Randow
26     else
27       echo $sum >>$Randow_Temp
28       daxiao=$sum
29     fi
30 }
31 
32 Print() {
33     read -p "请输入名字的拼音:" Name 
34     Randow
35     echo $Name $daxiao >>$name_Out_File
36 }
37 
38 while true
39 do
40    clear
41    echo ""
42    echo -e  "\033[32m        这个程序会将随机数字排名前三的同学显示出来!\033[0m"
43    echo -e  "\033[31m                     退出脚本请使用 'exit' \033[0m" 
44    echo ""
45    head -4 $name_Out_File2
46    read -p "请输入名字的拼音:" "Name"
47       if [ "$Name" == exit ]
48         then 
49           exit
50       fi
51    Randow
52    echo  $daxiao $Name >>$name_Out_File1
53    echo "随机数最大的三位同学是:"  >$name_Out_File2
54    sort -k1 -r $name_Out_File1 |column  -t >>$name_Out_File2
55    clear
56 done

 

剧本执行进程

 

root@Ubuntu:~/codelab#
sed ‘s/1/0/g’ sedfile
0
2
3
4
5
root@ubuntu:~/codelab# cat sedfile
1
2
3
4
5大家发现,在出口时,将1替换成了0;

-v 详细输出,包括呼吁和响应的首部

1.9.2 【练习题2】输出9×9 乘法表

本子内容:

[root@clsn scripts]# cat cfb.sh
#!/bin/bash
#############################################################
# File Name: cfb.sh
# Version: V1.0
# Author: clsn
# Organization:
# Created Time : 2017-12-11 15:40:03
# Description:
#############################################################
for a in `seq 1 9`
do
for b in `seq 1 9`
do
if [ $a -ge $b ]
then
echo -en “$a x $b = $(expr $a \* $b) ”

fi
done
echo ” “
done
九九乘法表

 

 1 [root@clsn scripts]# cat cfb.sh 
 2 #!/bin/bash
 3 #############################################################
 4 # File Name: cfb.sh
 5 # Version: V1.0
 6 # Author: clsn
 7 # Organization: http://blog.znix.top
 8 # Created Time : 2017-12-11 15:40:03
 9 # Description:
10 #############################################################
11 for a in `seq 1 9`
12 do
13         for b in `seq 1 9`
14         do
15                 if [ $a -ge $b ]
16                 then
17                         echo -en "$a x $b = $(expr $a \* $b)  "
18  
19                 fi
20         done
21 echo " "
22 done

 

施行结果

 

[root@clsn scripts]# sh  cfb.sh 
1 x 1 = 1   
2 x 1 = 2  2 x 2 = 4   
3 x 1 = 3  3 x 2 = 6  3 x 3 = 9   
4 x 1 = 4  4 x 2 = 8  4 x 3 = 12  4 x 4 = 16   
5 x 1 = 5  5 x 2 = 10  5 x 3 = 15  5 x 4 = 20  5 x 5 = 25   
6 x 1 = 6  6 x 2 = 12  6 x 3 = 18  6 x 4 = 24  6 x 5 = 30  6 x 6 = 36   
7 x 1 = 7  7 x 2 = 14  7 x 3 = 21  7 x 4 = 28  7 x 5 = 35  7 x 6 = 42  7 x 7 = 49   
8 x 1 = 8  8 x 2 = 16  8 x 3 = 24  8 x 4 = 32  8 x 5 = 40  8 x 6 = 48  8 x 7 = 56  8 x 8 = 64   
9 x 1 = 9  9 x 2 = 18  9 x 3 = 27  9 x 4 = 36  9 x 5 = 45  9 x 6 = 54  9 x 7 = 63  9 x 8 = 72  9 x 9 = 81

 

文本处理还有一个卓殊强劲的工具-awk

–retry num

1.9.3 【磨炼题3】解决dDOS攻击生产案例

  写一个Shell脚本解决DOS攻击生产案例。

  请按照web日志或者或者互连网连接数,监控当某个IP并发连接数或者暂时内PV达到100(读者按照实情设定),即调用防火墙命令封掉对应的IP。防火墙命令为:iptables-I
INPUT -s IP地址 -j DROP。

演习使用日志下载地址:

         脚本内容:

[root@clsn while]# cat ddos_check.sh
#!/bin/bash
#############################################################
# File Name: ddos_check.sh
# Version: V1.0
# Author: clsn
# Organization:
# Created Time : 2017-12-10 12:34:15
# Description:
#############################################################

Info_File=/tmp/ddos_check.log

#从连接数获取
#netstat -lant|awk -F “[ :]+” ‘/180:80/{clsn[$6]++}END{for(pol in
clsn)print pol,clsn[pol]}’ >$Info_File

# 从日记获取
awk ‘{hotel[$1]++}END{for(pol in hotel)print pol,hotel[pol]}’
access.log|sort -nk2 -r >$Info_File

while read line
do
Ip_Add=`echo $line |awk ‘{print $1}’`
Access=`echo $line |awk ‘{print $2}’`
if [ $Access -ge 10000 ]
then
#echo $Ip_Add
iptables -I INPUT -s $Ip_Add -j DROP
fi
done <$Info_File
竭泽而渔dDOS攻击脚本

 

 1 [root@clsn while]# cat ddos_check.sh 
 2 #!/bin/bash
 3 #############################################################
 4 # File Name: ddos_check.sh
 5 # Version: V1.0
 6 # Author: clsn
 7 # Organization: http://blog.znix.top
 8 # Created Time : 2017-12-10 12:34:15
 9 # Description:
10 #############################################################
11 
12 Info_File=/tmp/ddos_check.log
13 
14 #从连接数获取
15 #netstat -lant|awk -F "[ :]+" '/180:80/{clsn[$6]++}END{for(pol in clsn)print pol,clsn[pol]}' >$Info_File
16 
17 # 从日志获取
18 awk '{hotel[$1]++}END{for(pol in hotel)print pol,hotel[pol]}' access.log|sort -nk2  -r  >$Info_File
19 
20 while read line 
21 do 
22     Ip_Add=`echo $line |awk '{print $1}'`
23     Access=`echo $line |awk '{print $2}'`
24     if [ $Access -ge 10000 ]
25     then
26         #echo $Ip_Add
27         iptables -I INPUT -s $Ip_Add -j DROP
28     fi
29 done <$Info_File

 

本子执行结果:

 

[root@clsn while]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination  
DROP       all  --  112.64.171.98        anywhere     
DROP       all  --  58.220.223.62        anywhere     

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination  

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

 

此外格局开展日志分析

  elk日志分析

    

  nginx-WAF

    

我们首先看望awk的基本处理-按照逗号(,)分割获取想要的文本;

–retry timeo 指定重试的次数和距离

1.9.4 【陶冶题4】开发脚本入侵检测与报警案例(侵袭检测系统)

  监控web站点目录(/var/html/www)下拥有文件是或不是被恶意篡改(文件内容被改了),倘使有就打印改动的文件名(发邮件),定时职责每3分钟实施两回。

  IDS是英文“Intrusion Detection
Systems”的缩写,汉语意思是“侵袭检测系统”。

  脚本内容

首先个里程碑:生成md5验证文件

文本的校验文件

find /var/html/www/* -type f |xargs md5sum >/tmp/check/web_file_check.md5sum

目录的校验文件

tree /var/html/www/ -d  >/tmp/check/web_dir_check.txt
md5sum /tmp/check/web_dir_check.txt
md5sum /tmp/check/web_dir_check.txt >/tmp/check/web_dir_check.md5sum

剧本内容

[root@clsn check]# cat web_file_check.sh
#!/bin/bash
#############################################################
# File Name: web_file_check.sh
# Version: V1.0
# Author: clsn
# Organization:
# Created Time : 2017-12-10 14:15:34
# Description:
#############################################################

Url1=
Url2=
Dir=/tmp/check/
Web_Dir=/var/html/www/
Check_File1=/tmp/check/web_file_check.md5sum
Check_File2=/tmp/check/web_dir_check.md5sum
Check_Dir=/tmp/check/web_dir_check.txt
Check_Out=/tmp/check/check_out.md5sum
Mail_info=/tmp/check/mail.txt
Date=`date +%F_%T`
Host_Name=`hostname`
Host_IP=`hostname -I`
Email_Addr=995701749@qq.com

[ -d $Dir ] || mkdir -p $Dir
if [ ! -f $Check_File1 ]
then
cd $Dir &&\
wget $Url1
elif [ ! -f $Check_File2 ]
then
cd $Dir &&\
wget $Url2
fi

md5sum -c $Check_File1 >$Check_Out 2>/dev/null
Back_num1=$?
tree -d $Web_Dir >$Check_Dir
md5sum -c $Check_File2 &>/dev/null
Back_num2=$?
if [ $Back_num1 -ne 0 ]
then
echo “暴发主机:$Host_Name 主机IP地址:$Host_IP” > $Mail_info
echo “在 $Date 的检测中发觉以下文件被篡改” >>$Mail_info
echo “==================================================”
>>$Mail_info
egrep -i “失败|failed” $Check_Out >>$Mail_info
echo “==================================================”
>>$Mail_info
echo “请尽早登陆服务器进行处理!!!” >>$Mail_info
mail -s “【警告】web站点文件被篡改” -a $Check_File1 $Email_Addr
<$Mail_info
fi

if [ $Back_num2 -ne 0 ]
then
echo “目录检测新闻” >$Mail_info
echo “在 $Date 的检测中发现目录被曲解” >>$Mail_info
mail -s “【警告】web站点目录被歪曲” -a $Check_Dir
$Email_Addr<$Check_Dir
fi
侵略检测与报警

 

 1 [root@clsn check]# cat web_file_check.sh 
 2 #!/bin/bash
 3 #############################################################
 4 # File Name: web_file_check.sh
 5 # Version: V1.0
 6 # Author: clsn
 7 # Organization: http://blog.znix.top
 8 # Created Time : 2017-12-10 14:15:34
 9 # Description:
10 #############################################################
11 
12 Url1=http://10.0.0.1/web_file_check.md5sum
13 Url2=http://10.0.0.1/web_dir_check.md5sum
14 Dir=/tmp/check/
15 Web_Dir=/var/html/www/
16 Check_File1=/tmp/check/web_file_check.md5sum
17 Check_File2=/tmp/check/web_dir_check.md5sum
18 Check_Dir=/tmp/check/web_dir_check.txt
19 Check_Out=/tmp/check/check_out.md5sum
20 Mail_info=/tmp/check/mail.txt
21 Date=`date +%F_%T`
22 Host_Name=`hostname`
23 Host_IP=`hostname -I`
24 Email_Addr=995701749@qq.com
25 
26 [ -d $Dir ] || mkdir -p $Dir
27 if [ ! -f $Check_File1 ] 
28   then 
29     cd $Dir &&\
30     wget $Url1
31 elif [ ! -f $Check_File2 ]
32    then 
33     cd $Dir &&\
34     wget $Url2
35 fi
36 
37 md5sum -c $Check_File1 >$Check_Out  2>/dev/null
38 Back_num1=$?
39 tree -d $Web_Dir >$Check_Dir
40 md5sum -c $Check_File2 &>/dev/null
41 Back_num2=$?
42 if [ $Back_num1 -ne 0 ]
43   then
44     echo "发生主机:$Host_Name  主机IP地址:$Host_IP"  > $Mail_info
45     echo "在 $Date 的检测中发现以下文件被篡改" >>$Mail_info
46     echo "==================================================" >>$Mail_info  
47     egrep  -i  "失败|failed"  $Check_Out >>$Mail_info
48     echo "==================================================" >>$Mail_info  
49     echo "请尽快登陆服务器进行处理!!!"  >>$Mail_info
50     mail -s "【警告】web站点文件被篡改" -a $Check_File1 $Email_Addr <$Mail_info
51 fi
52 
53 if [ $Back_num2 -ne 0 ]
54   then
55     echo "目录检测信息" >$Mail_info
56     echo "在 $Date 的检测中发现目录被篡改" >>$Mail_info
57     mail -s "【警告】web站点目录被篡改" -a $Check_Dir $Email_Addr<$Check_Dir
58 fi

 

修改文件目录后实施结果

 

 

 

root@ubuntu:~/codelab# cat awkfile
this,is,a,awk,file
this,is,a,awk,file
root@ubuntu:~/codelab# cat awkfile | awk -F ‘,’ ‘{print $0}’
this,is,a,awk,file
this,is,a,awk,file
root@ubuntu:~/codelab# cat awkfile | awk -F ‘,’ ‘{print $1}’
this
this
root@ubuntu:~/codelab#
那边大家得以看出awk可以按照自由格局分开文本,然后输出;

–tcp-nodelay 打开TCP_NODELAY选项  不举办捎带确认

1.9.5 【训练题5】单词及字母去重排序案例

用shell处理以下内容

  1、按单词出现频率降序排序!

  2、按字母出现频率降序排序!

the squid project provides a number ofresources to assist users design implement and support squid installations.Please browse the documentation and support sections for more infomation byoldboy training

         脚本内容:

 

[root@clsn play]# cat abc.sh 
#!/bin/bash
#############################################################
# File Name: abc.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-11 17:23:19
# Description:
#############################################################

a="the squid project provides a number ofresources to assist users design implement and support squid installations.Please browse the documentation and support sections for more infomation byoldboy training"

echo "按单词出现频率降序排序!"
for i in $a 
  do 
   echo $i 
done|\
  sort |uniq -c|sort -nk1  -r
echo "按字母出现频率降序排序!"
echo $a |grep -o "[a-z]" |sort|uniq  -c |sort -nk1 -r

 

8).特殊变量和值

-O  按服务器上的称谓保存下载的公文

1.9.6 【练习题6】编写正(或长)方形图形案例

请用shell或Python编写一个正(或长)方形,接收用户输入的数字。

         shell脚本内容

 

[root@clsn play]# cat  zhengfangxing.sh
#!/bin/bash
#############################################################
# File Name: zhengfangxing.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-11 17:33:33
# Description:
#############################################################
trap "echo 输入exit退出" 2
while true
  do
    read -p "你想看多大的正方形:" a
    [ "$a" == "exit" ] && exit 
    expr 1 + $a &>/dev/null  
    [ $? -ne 0 ] && echo "请输入一个数字!" && exit 2
    b="■ "
    d=$(for i in `eval echo {1..$a}`;do echo -n $b; echo -n " ";done)

    for i in `eval echo {1..$a}`
     do
      echo "$d"
    done
done

 

         脚本实施职能

 

[root@clsn play]# sh  zhengfangxing.sh  4
■ ■ ■ ■ 
■ ■ ■ ■ 
■ ■ ■ ■ 
■ ■ ■ ■ 
[root@clsn play]# sh  zhengfangxing.sh  3
■ ■ ■ 
■ ■ ■ 
■ ■ ■

 

回去顶部

下列变量经常兼有定位意义

-r/–range  from-to 下载指定range内的多少

1.10 种种语句小结

  磊 
while循环的看家本领是进行守护进度以及我们希望循环不脱离持续推行,用于频率低于1分钟循环处理(crond),其余的while循环大概都可以被for循环替代。

  磊  
case语句可以被if语句替换,一般在系统启动脚本传入少量稳住规则字符串用case语句,其余平日判断多用if。

  磊  一句话,if,for语句最常用,其次while(守护进程),case(服务启动脚本)。

再次来到顶部

$#    表示变量的个数,常用于循环
$@    当前命令行所有参数。置于双引号中,表示个别参数
$*   
当前命令行所有参数。置于双引号中,表示将命令行所有参数当初一个单身参数
$-(连字号)    在引用数予以Shell的选项
$?    表示上一个发令退出的情况
$$    表示近年来历程编号
$0    表示近期先后名称
$!    表示近来一个后台命令的长河编号
$HOME    表示近年来用户根目录
$IFS    表示其中的字段分隔符
$LANG    当前locale默认名称
$PATH    环境变量
$PPID    父进度编号
$PWD    当前工作目录下列特殊值可以援救排查问题

-C 在保留文件时开展续传

1.11 附录

0    成功退出
>0    退出败北
1-125   
命令退出失利,战败重回的相关值由程序定义(譬如,程序内退出只举行 exit
2,则赶回为2)
126    命令找到了,但无法执行
127    命令找不到
>128    命令因受到信号而过逝9.定时职分

Wget命令总括:

1.11.1 格式化文本–对齐文本

 

[root@clsn scripts]# column --help 

用法:
 column [选项] [文件 ...]

选项:
 -c, --columns <宽度>     输出宽度(字符数)
 -t, --table              创建表格
 -s, --separator <字符串> 可用的表格分隔符
 -o, --output-separator <字符串>
                          表格输出列分隔符,默认为两个空格
 -x, --fillrows           先填充行,再填充列

 -h, --help     显示此帮助并退出
 -V, --version  输出版本信息并退出

更多信息请参阅 column(1)。

 

windows系统下有定时职责,在linux系统上也一如既往有定时职分。使用系统自带的crontab即可兑现;

例子:

1.11.2 服务器被挂马怎么做?

  1. 将被挂马服务器上,原有主要数据备份下来
  2. 周全筛查数据,确保内部都是正常文件
  3. 重新安装服务器操作系统,并对准的狠抓平安防范。
  4. 切记,服务器中木马后务必重新安装操作系统。

本人的种类上实施 cat /etc/crontab的出口如下:

wget  

1.11.3 怎么通过进程找到程序

由此进程找到pid号码

[root@clsn proc]# ps -ef |grep sshd 
root       1294      1  0 09:18 ?        00:00:00 /usr/sbin/sshd -D

         通过pid找到在proc目录下的临时文件夹

[root@clsn proc]# cd /proc/1294
[root@clsn 1294]# 

         查看里面的exe文件,即可发现先后文件的门道

[root@clsn 1294]# ll exe 
lrwxrwxrwx 1 root root 0 12月 11 09:18 exe -> /usr/sbin/sshd

# cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don’t have to run the `crontab’
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

参照网址:

1.11.4 screen程序 防止脚本实施中断

  用操作,越来越多详情参照 

ctrl +a +d  退出当前终端,返回加载screen前的shell命令状态
screen -ls 可看screen会话
screen -r id 指定进入哪个screen会话

         screen进程原理

 

[root@clsn ~]# ps -ef |grep ping 
root      30170  30153  0 11:57 pts/5    00:00:00 ping 10.0.0.254
root      30172  30078  0 11:58 pts/0    00:00:00 grep --color=auto ping
[root@clsn ~]# ps -ef |grep 30170
root      30170  30153  0 11:57 pts/5    00:00:00 ping 10.0.0.254
root      30174  30078  0 11:59 pts/0    00:00:00 grep --color=auto 30170
[root@clsn ~]# ps -ef |grep 30153
root      30153  30119  0 11:57 pts/5    00:00:00 /bin/bash
root      30170  30153  0 11:57 pts/5    00:00:00 ping 10.0.0.254
root      30176  30078  0 11:59 pts/0    00:00:00 grep --color=auto 30153
[root@clsn ~]# ps -ef |grep 30119
root      30119      1  0 11:56 ?        00:00:00 SCREEN
root      30120  30119  0 11:56 pts/4    00:00:00 /bin/bash
root      30153  30119  0 11:57 pts/5    00:00:00 /bin/bash
root      30178  30078  0 11:59 pts/0    00:00:00 grep --color=auto 30119

 

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

awk命令总括:

1.11.5 shell中贯彻倒计时效果

剧本内容

 

[root@clsn scripts]# cat daojishi.sh 
#!/bin/bash
#############################################################
# File Name: daojishi.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-12 08:49:11
# Description:
#############################################################

for i in `seq -w 10 -1 1`
  do
    echo -ne "\b\b$i";
    sleep 1;
done

 

本子执行效率

 

再次来到顶部

# m h dom mon dow user command
17 * * * * root    cd / && run-parts –report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts
–report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts
–report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts
–report /etc/cron.monthly )
#
从那边大家得以看来cron是什么样行使的,那里设定了cron使用shell,上边是命令的装置方式。

awk -F “|” ‘{print $1}’   file 根据新的相间符“|”举行操作。

1.12 linux中的信号

minute: 表示分钟,可以是从0到59之内的别样整数。
hour:表示小时,可以是从0到23之间的其他整数。
day:表示日期,可以是从1到31里头的别样整数。
month:表示月份,可以是从1到12之内的其余整数。
week:表示星期几,可以是从0到7之间的别样整数,那里的0或7意味星期天。
command:要举办的命令,能够是系统命令,也得以是上下一心编写的剧本文件。大家可以使用如下一些基础命令;

一声令下参考地址:

1.12.1 Linux系统的要紧信号及注脚

信号

说明

HUP(l)

挂起,通常因终端掉线或用户退出而引发

INT(2)

中断,通常因按下Ctrl+c组合键而引发

QUIT(3)

退出,通常因按下Ctrl+\组合键而引发

ABRT(6)

中止,通常因某些严重的执行错误而引发

ALRM(14)

报警,通常用来处理超时

TERM(15)

终止,通常在系统关机时发送

TSTP(20)

停止进程的运行,但该信号可以被处理和忽略,通常因按下Ctrl+z组合键而引发

   使用trap控制信号平时需求忽略的信号包罗HUP、INT、QUIT、TSTP、TERM等,对应的信号编号分别为1、2、3、20、15。Shell脚本中既能够用数字来代表信号,也得以动用信号的名字来表示信号

1.12.2选择trap控制信号

  trap命令用于指定在收到到信号后即将利用的行走,信号的连带表达前边早已涉及
过。trap命令的一种普遍用途是在本子程序被中止时成功清理工作,或者屏蔽用户私自
使用的某些信号。在拔取信号名时供给不难SIG前缀。可以在命令提醒符下输人命令
trap -1来查阅信号的号子及其关联的名目。

  trap命令的参数分为两片段,前一部分是吸纳到指定信号时就要利用的行动,后一有的是要处理的信号名。

  trap命令的使用语法如下:

trap command signal

     
 signal是指接受到的信号,command是指接受到该信号应选拔的行进。也就是:

trap ‘命令;命令’ 信号编号
或
trap ‘命令;命令’ 信号名

[root@clsn ~]# trap 'echo clsn' 2 
[root@clsn ~]# ^Cclsn

再次来到顶部

usage: crontab [-u user] file
 crontab [ -u user ] [ -i ] { -e | -l | -r }
  (default operation is replace, per 1003.2)
 -e (edit user’s crontab)
 -l (list user’s crontab)
 -r (delete user’s crontab)
 -i (prompt before deleting user’s crontab)10).技巧

1.13 参考文档

http://blog.csdn.net/zhangna20151015/article/details/50293987
https://zh.wikipedia.org/wiki/For迴圈#傳統的_for_迴圈_for-loops 
https://zh.wikipedia.org/wiki/While迴圈
https://www.cnblogs.com/kerrycode/p/6537175.html (生产随机数)
http://blog.51cto.com/lidao/1936495  (不循环,批量创建用户)
http://www.runoob.com/linux/linux-shell-func.html 函数

 

 

本博文中二〇一七年四月11日事先运用的系统版本为: CentOS release 6.9 (Final)
内核版本为: 2.6.32-696.10.1.el6.x86_64
            在二零一七年十二月11日过后发布的博文使用的种类版本为: CentOS Linux
release 7.4.1708 (Core) 内核版本为: 3.10.0-693.el7.x86_64

大家只要有什么样难点得以留言或邮件联系
clsn@nmtui.com,我看到后会尽快恢复生机。
正文出自 “惨绿少年”
博客,欢迎转载,但未经作者同意必须保留此段注明,且在篇章页面鲜明地方给出。
作品来源:http://blog.znix.top

 

a)判断参数是不是是数字。

用while循环批量创制用户:

#!/bin/sh
#1. $1是本子的首先个参数,那里作为awk命令的率先个参数传入给awk命令。
#2. 出于尚未输入文件作为输入流,因而这里只是在BEGIN块中成就。
#3.
在awk中ARGV数组表示awk命令的参数数组,ARGV[0]表示命令本身,ARGV[1]意味着第二个参数。
#4.
match是awk的停放函数,重返值为协作的正则表明式在字符串中(ARGV[1])的开场地点,没有找到再次来到0。
#5.
正则表明式的写法已经保障了非凡的字符串一定是十进制的正整数,如需求浮点数或负数,仅需修纠正则即可。
#6. awk执行到位后将结果再次来到给isdigit变量,并作为其起始化值。
#7. isdigit=`echo $1 | awk ‘{ if (match($1, “^[0-9]+$”) != 0) print
“true”; else print “false” }’ `
#8.
上边的写法也能促成该成效,但是由于有三个进程参预,因而功能低于上边的写法。
isdigit=`awk ‘BEGIN { if (match(ARGV[1],”^[0-9]+$”) != 0) print
“true”; else print “false” }’ $1`
if [[ $isdigit == “true” ]]; then
      echo “This is numeric variable.”
      number=$1fib) 按照系统给变量赋值,确保可移植性

Nmap命令计算:

#1.
通过uname命令获取当前的系统名称,之后再按照OS名称的不比,给PING变量赋值差其他ping命令的齐全。
osname=`uname -s`
#2. 可以在case的标准中添加更加多的操作系统名称。
case $osname in
      “Linux”)
          PING=/usr/sbin/ping ;;
      “FreeBSD”)
          PING=/sbin/ping ;;
      “SunOS”)
          PING=/usr/sbin/ping ;;
      *)
          ;;
esac
3.总结

nmap 192.168.0.101运用ip地址扫描打开的端口

那几个只是shell开发中的最基础部分,shell
其实是一种相当便捷、强大的语言,不断学习和积累一定会越发百发百中。

指令参考地址:

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-10/136040.htm

澳门金沙国际 16

sed命令详解:

sed轻量级的流编辑器。sed首假若用来将数据进行选用,替换

除去,新增的指令

sed命令格式: sed [选项]-‘[动作]’文件名

选项:

-n       参加此选项,则会吗经过sed命令处理的行输出的显示屏上

-e      允许对输入数据利用多条sed命令编辑

-i      用sed的修改结果平昔下该读取数据的文书,而不是由显示屏输出

动作:

a \:    追加  sed -i ‘1a xixi’ /tmp/haha 在率先行后边追加xixi

c \:    行替换 sed -i ‘2c haha ‘/etc/httpd/conf/httpd.conf
把第二行的情节替换为haha

i \:   插入 sed -i ‘4i haha’ /tmp/haha 在第四行插入haha

d  :   删除 sed -i ‘4d ‘ /tmp/haha 删除第四行的haha

p  :   打印,输出指定的行  sed -n ‘2p’ /tmp/haha
打印出第二行,输出到屏幕

s  :   字串替换格式为: 行范围s/旧字串/新字串/g  sed -i ‘1s/2/3/g’
1.sh   将率先行的2换为3

sort /etc/passwd    排序命令

sort -r /etc/passwd   取反

unip去重命令:

其选项意义:
-u 只体现不重复行。
-d 只体现有再次数据行,每种重复行只展现其中一行
-c 打印每一重复行现身次数。
-f n为数字,前n个域被忽视。

实战教学:

澳门金沙国际 17

注:编辑数字为了测试

澳门金沙国际 18

留意:uniq -c 命令打印每四遍重复出现的行,并用sort进行排序

澳门金沙国际 19

注:uniq -u命令突显不另行的行

澳门金沙国际 20

注:uniq -d只显示重复的行

澳门金沙国际 21

注:uniq -c -d 组合使用,展现重复的次数

Sort排序命令详解:

-b:忽略每行前面开首出的空格字符;

-c:检查文件是或不是早已按照顺序排序;

-d:排序时,处理英文字母、数字及空格字符外,忽略其余的字符;

-f:排序时,将小写字母视为大写字母;

-i:排序时,除了040至176期间的ASCII字符外,忽略其余的字符;

-m:将几个排序号的公文举行统一;
-M:将前方3个字母按照月份的缩写举办排序;

-n:根据数值的大大小小排序;

-o<输出文件>:将排序后的结果存入制定的文本;

-r:以相反的逐一来排序;

-t<分隔字符>:指定排序时所用的栏位分隔字符;

实战教学:

澳门金沙国际 22

注:实战源文件

澳门金沙国际 23

注:sort命令默认排序

澳门金沙国际 24

注:sort -r 以相反的一一举办排序

澳门金沙国际 25

注:以上命令是将第三列的数组根据从小到大排列

澳门金沙国际 26

注:以上命令是将第三列的数组依照从大到小排列

for循环和while循环

#! /bin/bash

PREFIX=yangxu

I=0

while [ $I -le 20 ]

do

useradd ${PREFIX}$I

echo “123.com”|passwd –stdin ${PREFIX}$I

let I++

done

用for循环开发乘法口诀表:

#! /bin/bash

for a in `seq 1 9`

        do

                for b in `seq 1 9`

        do

                if [ $a  -ge $b ]

                        then

                                echo -ne ” $a x $b = $(expr $a \* $b)”

 

fi

done

echo ”       “

 

done

实施成效:

澳门金沙国际 27

循环打印出1-10

#! /bin/bash

for i in `seq 10`

do

echo $i

done

推行效果:

澳门金沙国际 28

双重for循环:

#! /bin/bash

for i in `echo www.`

do

        for b in `echo qq.com qq.cn 163.com 163.cn`

do

echo $i $b     

done

do

执行功能:

澳门金沙国际 29

用for循环来寓目continue和break 和exit的界别

#! /bin/bash

 

for ((i=0 ; i<=6 ; i++))

do

        if [ $i -eq 3 ];then

continue

#break

                #exit

        fi

                echo $i

done

echo “ok”

continue

实践功用:

澳门金沙国际 30

注:continue就是当循环当这一个i=3的时候就跳过本次巡回,间接进行下五回巡回

Break执行出力:

澳门金沙国际 31

注:break要是满意条件直接跳出此循环,输出循环外的参数

exit执行效果:

澳门金沙国际 32

注:exit即使知足条件输出,就会直接跳出脚本

用shell脚本开发一个配置临时ip的台本:

#! /bin/bash

case $1 in

  up)

for ((i=0; i<=10; i++))

do

if [ $i -eq 5 ]

        then

                continue

        fi

ifconfig eth0:$i 192.168.0.$i netmask 255.255.255.0 $1

done

;;

  down)

for ((i=0; i<=10; i++))

do

if [ $i -eq 5 ]

        then

                continue

        fi

ifconfig eth0:$i 192.168.0.$i netmask 255.255.255.0 $1

done

;;

  *)

echo “Usage {up | down}”

esac

用shell脚本开发批量创设用户脚本,并用随机数为密码,将用户和密码打印到pw.txt文件中

#! /bin/bash

I=0

PREFIX=user-

while [ $I -le 20 ]

do

PW=`echo $RANDOM|md5sum|cut -c 5-12`

useradd ${PREFIX}$I

echo ${PREFIX}$I $PW >>pw.txt

echo “—————-“>>pw.txt

echo $PW |passwd –stdin ${PREFIX}$I

let I++

done

推行结果:

澳门金沙国际 33

用shell脚本开发一个本子执行菜单

#! /bin/bash

                      echo “脚本配置菜单”

echo “1.安装配备服务”

echo “2.开立删除用户”

echo “3.部署网络”

echo “请输入要履行的菜系命令(1/2/3):”

read com

case $com in

1)

echo “1.Nginx安装”

echo “2.Mysqld安装”

echo “3.PHP安装”

 

read a

        if [ $a -eq 1 ]

                then

                bash nginx.sh

        else

        if [ $a -eq 2 ]

                then

                bash mysql.sh

        else

        if [ $a -eq 3 ]

        then

        echo “您正在设置PHP服务,请稍后。。。”

        fi

               fi

               fi

;;

2)

echo “1.创办用户”

echo “2.去除用户”

read b

        if [ $b -eq 1 ]

                then

                bash useradd.sh

                else

        if [ $b -eq 2 ]

                then

                bash userdel.sh

        fi

        fi

;;

3)

echo “1.配置ip地址”

echo “2.重启网络服务”

read c

        if [ $c -eq 1 ]

        then

        bash ip.sh

  else

        if [ $c -eq 2 ]

        then

        bash fuwu.sh

        fi

        fi

;;

*)

echo “请输入要推行的菜谱命令(1/2/3):”

;;

esac

执行效果:

澳门金沙国际 34

标准测试:

运算符:

平头比较运算符                                       描述

num1 –eq       num2                  若是num1等于 num2,测试结果为0

num1 –ge num2                   要是num1大于或等于 num2,测试结果为0

num1 –gt num2                    倘若num1大于 num2,测试结果为0

num1 –le num2                  要是num1小于或等于 num2,测试结果为0

num1 –lt  num2                  借使num1小于 num2,测试结果为0

num1 –ne num2                   即便num1不对等 num2,测试结果为0

判断文件 -f

澳门金沙国际 35

判定一般文书–e

澳门金沙国际 36

看清目录–d

澳门金沙国际 37

判断文件是不是有进行权-x

澳门金沙国际 38

认清是不是为空–z

澳门金沙国际 39

判断是或不是不为空-n

澳门金沙国际 40

-r测试是还是不是有读的权能

加减乘除运算:

行使shell脚本开发计算器,用read读入方式,并对变量个数举办判断

#! /bin/bash

read -t 5 -p “Pls input two number :” a b

expr $a + 0 &>/dev/null

expr $b + 0 &>/dev/null

        if [ $? -eq 0 ]

                then

 

                        echo “a-b=$((a-b))”

                        echo “a+b=$((a+b))”

                        echo “a*b=$((a*b))”

                        echo “a/b=$((a/b))”

 

                else

                        exit

        fi

应用shell脚本开发总计器,用传参格局,并对变量个数进行判断

#! /bin/bash

a=$1

b=$2

function YUN(){

         echo “a+b=$((a+b))”

         echo “a-b=$((a-b))”

         echo “a*b=$((a*b))”

         echo “a/b=$((a/b))”

}

        if [ $# -eq 2 ]

                then

                        YUN

                else

                        echo “Pls input two number”

                exit

        fi     

 

case $1 in

 *)

   exit

;;

esac

进行职能:

澳门金沙国际 41

Bc命令总计:

澳门金沙国际 42

Expr命令计算

澳门金沙国际 43

小括号算法:

澳门金沙国际 44

澳门金沙国际 45

概念函数以及调用函数

#! /bin/bash

#概念变量

function Number(){

seq -w 10

}

function Zimu(){

echo {a..z}

}

#调用变量

 Number

 Zimu

履行结果:

澳门金沙国际 46

调用系统变量/etc/init.d/functions

#! /bin/bash

[ -f /etc/init.d/functions ]&& . /etc/init.d/functions || exit

action “nginx is running”  /bin/true

action “nginx is stoped”   /bin/false

实施结果:

澳门金沙国际 47

用shell脚本开发nginx服务启动脚本

#! /bin/bash

NGINX=”/usr/local/nginx/sbin/nginx”

nginxSTOP=”killall -s QUIT nginx”

. /etc/init.d/functions

nginxNumber=`netstat -anpt |grep nginx|wc -l`

 

case $1 in

  start)

        $NGINX

        [ $? -eq 0 ]&&action “nginx is running” /bin/true || action
“nginx is running” /bin/false

;;

  stop)

        $nginxSTOP

        [ $? -eq 0 ]&&action “nginx is stoped” /bin/true || action
“nginx is stoped”  /bin/false

;;

  restart)

        $0 stop

               Sleep 2

        $0 start

;;

  *)

echo ” Usage {stop | start |restart }”

esac

推行职能:

澳门金沙国际 48

形式二:Nginx服务启动脚本

#! /bin/bash

# chkconfig:- 85 15

# description:hehe

PROG=”/usr/local/nginx/sbin/nginx”

PID=”/usr/local/nginx/logs/nginx.pid”

 

case “$1” in

 start)

$PROG

if [ $? -eq 0 ]

  then

        echo  “正在起步nginx服务” 

fi

;;

 stop)

killall -s QUIT nginx

if [ $? -eq 0 ]

 

then

        echo  “正在关闭nginx服务”

fi

;;

status)

DUAN=$(netstat -anpt |grep nginx |awk -F ‘ ‘ ‘{print $4}’ |awk -F  ‘:’
‘{print $2}’)

if [ -z $DUAN  ]

then

        echo “服务没有启动”

else

 

if [ $DUAN=80 ]

then

        echo “服务已经启动”

else

        echo “服务没有启动”

fi

fi

;;

 

restart)

$0 stop

$0 start

 

echo “正在重启nginx服务”

;;

 *)

echo “Usage: $0 (start|stop|restart )”

exit 1

esac

exit 0

施行结果:

澳门金沙国际 49

用shell脚本判断1.0网段有些许ip在线

#! /bin/bash

. /etc/init.d/functions

for i in `seq 1 254`

do

ping -c 3 -w 3 192.168.1.$i >>/dev/null &&action “host
192.168.1.$i” /bin/true ||action “host 192.168.1.$i” /bin/false

done

举办结果:

澳门金沙国际 50

此脚本可以转移系统字体颜色,脚本有点小瑕疵

#!/bin/bash

#把所以颜色定义变量

Black=`echo -e “\033[30m 黑色字 \033[0m”`

Red=`echo -e “\033[31m 红色字 \033[0m”`

Green=`echo -e “\033[32m 绿色字 \033[0m”`

Yellow=`echo -e “\033[33m 黄色字 \033[0m”`

Blue=`echo -e “\033[34m 蓝色字 \033[0m”`

Purple=`echo -e “\033[35m 紫色字 \033[0m”`

Blue_words=`echo -e “\033[36m 天蓝字 \033[0m”`

White=`echo -e “\033[37m 白色字 \033[0m”`

read -p ” What color do you like? :” com

#用case语句匹配

case $com in

  red )

         $Red

;;

  black)

        $Black

澳门金沙国际 ,;;

  green)

        $Green

;;

  blue)

        $Blue

;;

  yellow)

        $Yellow

;;

  white)

        $White

;;

  purple)

        $Purple

;;

  blue_words)

        $Blue_words

;;

  *)

     echo “Usage: Pls input {red | black | green | yellow | white |
purple | blue_words | blue |} “

;;

Esac

进行效劳:

澳门金沙国际 51

注:以上脚本调用变量的时候加echo就ok

用curl命令远程探测服务端口,如果服务宕机视同一律启

#! /bin/bash

. /etc/init.d/functions

Check_curl=`curl -I -s -1|cut -d ”
” -f2`

Check_curl1=`curl -I -s -1|cut -d
” ” -f3`

 

if [ “$Check_curl” == “200” ]

        then

                  action “nginx is running” /bin/true

        else

if [ “$Check_curl1” == “OK” ]

        then

                action “nginx is running” /bin/true

        else

                action “nginx is stoped” /bin/false

                service nginx start >>/dev/null

fi

fi

举行结果:

澳门金沙国际 52

用nmap远程探测工具,模拟用户探测服务是还是不是宕机

#! /bin/bash

. /etc/init.d/functions

nmapPort=`nmap 192.168.1.103  -p 80|grep -w “open”|cut -d ” ” -f2`

nmapService=`nmap 192.168.1.103 -p 80|grep -w “open”|cut -d ” ” -f4`

if [ $nmapPort == “open” ]

        then

                action “httpd is running” /bin/true

        else

if [ $nmapService == “httpd” ]

        then

                action “httpd is running” /bin/true

        else

                  action “httpd is stoped” /bin/false

fi

fi

方式二,用剧本传参的章程完结上述作用:

#! /bin/bash

[ -f /etc/init.d/functions ] && . /etc/init.d/functions ||exit 1

if [ $# -ne 2 ]

        then

echo “Usage:Pls input {IP and port}”

 

exit

fi

 

 

Nmap=`nmap $1 -p $2 |grep open|wc -l`

if [ “$Nmap” == 1 ]

        then

action “$1 $2 is running” /bin/true

        else

action “$1 $2 is closed” /bin/false

 

fi

数组:

澳门金沙国际 53

注:以上是概念数组和查看数组的长度和数组的情节

删去数组:

澳门金沙国际 54

将数组中的4改为10

澳门金沙国际 55

用for打印数组中的数到10就淡出:

#!/bin/bash

array=( 1 2 3 10 11)

for i in `echo ${array[*]}`

do

if [ $i -eq 10 ]

        then

                break

fi

echo $i

done

澳门金沙国际 56

打印出数组内容和数首席执行官度:

#! /bin/bash

array=(1 2 3)

for(( i=0; i<${#array[@]}; i++))

do

echo “This is number $i,then content is ${array[$i]}”

done

echo “———————-“

echo “this is length is  ${#array[*]}”

echo “数组内容为 ${array[*]}”

实施职能:

澳门金沙国际 57

用for循环批量该文件名:

#! /bin/bash

for filename in `ls *.jpg`

do

mv $filename `echo $filename|cut -d “.” -f1`.gif

done

方法二:

#! /bin/bash

for i in `ls *.txt`

do

mv $i `echo $i |cut -d “.” -f1`.doc

done

1.翻看系统信号,并对信号举行拍卖

澳门金沙国际 58

澳门金沙国际 59

注:常用信号处理,需回忆

澳门金沙国际 60

做完信号处理,我们再运行守护进度,验证作用:

澳门金沙国际 61

现今就足以看出在一个医护进度中,无法用ctrl+c来终止

Shell跳板机:

#! /bin/bash

function trapper(){

trap “” `seq 1 64`

}

while :

do

trapper 

        clear

        cat <<menu

        1)web 1

        2)web 2

        3)exit

menu

read -p “Pls select :” num

case “$num” in

1)

echo 1

ssh 192.168.1.1

;;

2)

echo 2

ssh 192.168.1.2

;;

3|*)

exit

esac

done

 

[ $UID -ne 0 ]&& .
/scripts/service/tiaoban.sh———在/etc/profile.d/创设文件,写入—[
$UID -ne 0 ]&& . /scripts/service/tiaoban.sh

相关文章