第 13 章 学习shell script

来源:互联网 发布:linux怎样切换到root 编辑:程序博客网 时间:2024/06/11 00:04

    • 1 什么是shell script
      • 为什么学习 shell script
      • 第一个 script 的编写与执行有以下注意事项
      • 编写shell script的良好习惯
    • 2简单的shell script 练习
      • script的执行方式区别sourceshscriptscript
    • 3善用判别式
      • 利用test命令的测试功能
      • 利用判断符号
      • shell script的默认变量01
    • 4条件判断式
      • ifthen
      • 利用 caseesac 判断
      • 利用 function 功能
    • 5循环loop
      • while do doneuntil do done不定循环
      • fordodone 固定循环
      • fordodone的数值处理
      • shell script的追踪与调试

13.1 什么是shell script

 shell script是利用shell的功能缩写的一个”程序”,这个程序使用纯文本文件,将shell的语法与命令(含外部命令)卸载里面,配合正则表达式、管道命令与数据流重定向等功能,以达到我们所想要的处理目的。
shell script就像是早期DOS年代的批处理文件(.bat),最简单的功能就是将许多命令写在一起。

为什么学习 shell script

  • 自动化管理的重要依据
    • 写脚本每日自动分析如下任务:查询登录文件、追踪流量、监控用户使用主机状态、主机软件状态、主机各项硬设备状态、主机软件更新查询等
  • 追踪与管理系统的重要工作
    • linux系统的服务启动的接口在/etc/init.d/这个目录下,目录下的所有文件都是script。
  • 简单入侵检测功能
    • 当我们的系统有异常时,大多会将这些异常记录在系统记录器,也就是我们常提到的”体统注册表文件”,那么我们可以在固定的几分钟内主动去分析系统注册表文件,若察觉有问题,就立刻通报管理员,或者立刻加强防火墙的规则设置。
  • 连续命令单一化
    • script可以想成仅是帮我们把一大串的命令集合在一个文件里面,而直接执行该文件就可以执行那一串又臭又长的命令段
  • 简单的数据处理
  • 夸平台支持与学习历程较短
    总结:
    虽然script号称是程序,但实际上shell script处理数据的速度是不太够的。因为shell script用的是外部的命令与bash shell的一些默认工具,所以它常常会去调用外部的函数库,因此,命令周期上面肯定比不上传统的程序语言.所以shell script用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上,就不够好了.因为shell script 的速度较慢,切使用的cpu资源较多,造成主机资源的分配不良.我们通常利用 shell script 来处理服务器的检测,倒是没有进行大量运算的需求.

    指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成,是从取指令、分析指令到执行完所需的全部时间。


第一个 script 的编写与执行;有以下注意事项

  • 命令的执行时从上而下、从左而右第分析与执行;
  • 命令、参数间的多个空白都会被忽略掉;
  • 空白行也将被忽略掉,并且[tab]按键所的空白同样是为空格键;
  • 如果读取到一个Enter符号(CR),就尝试开始执行改行(或该串)命令;
  • 至于如果一行的内容太多,则可以使用”[Enter]”来扩展至下一行;
  • “#”可作为批注。任何加载#后面的数据将全部被视为批注文字而被忽略。

    可以用以下方式来执行.sh的可执行文件

  • 直接命令执行:绝对路径;相对路径;变量”PATH”功能(PATH路径内的可执行文件,可以在任何时候下执行)
  • 以bash进程来执行:通过”bash shell.sh” 或 “sh shell.sh”来执行

关于exit: exit n,bash就会退出脚本的执行并将n值返回给?,我们可以echo $? 来查询系统当前的返回值

编写shell script的良好习惯

每个script的文件头处记录如下信息:

  1. script的功能;
  2. script的版本信息;
  3. script的作者与联络方式;
  4. script的版本声明方式;
  5. script的History(历史记录);
  6. script内较特殊的命令,使用”绝对路径”的方式来执行;
  7. script执行时需要的环境变量预先声明与设置。(设置好PATH就可以在这个程序在进行时可以直接执行一些外部命令,而不必写绝对路径)

13.2简单的shell script 练习

  • 第一个script
[root@www scripts]# vi sh01.sh#!/bin/bash# Program:#       This program shows "Hello World!" in your screen.# History:# 2005/08/23    VBird   First releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHecho -e "Hello World! \a \n"exit 0
  • 数值运算脚本:简单的加减乘除
#!/bin/bash# Program:#       User inputs 2 integer numbers; program will cross these two numbers.# History:# 2016/05/10    Hanzhou First releasePATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/gamesexport PATHecho -e "You SHOULD input 2 numbers, I will cross them! \n"read -p "first number:  " firstnuread -p "second number: " secnutotal=$(($firstnu*$secnu))echo -e "\nThe result of $firstnu x $secnu is ==> $total"
  • 两种数值运算方法
    • $((计算式))可以用来进行数值运算(常用)
    • declare -i total=$firstnu*$secnu

script的执行方式区别(source,shscript,./script)

  • 利用soucrce来执行脚本:在父进程中执行,不会另开一个进程。其他方式都会另开一个进程。

13.3善用判别式

利用test命令的测试功能

test -e dmtsai 检测文件dmtsai是否存在
test的常用参数:

  • 文件的判定
    -e 文件名是否存在
    -f 文件名是否存在且为文件
    -d 文件名是否存在且为目录

test file1 -nt file2 判断file1 是否比file2新
test file1 -ot file2 判断file1 是否比file2旧
test file1 -ef file2 判断file1 与file2是否为同一个文件,可以用在判断hard link的判定上.主要意义在判定两个文件是否均指向同一个inode

  • 两个整数之间的判定:
    -eq 数值相等
    -ne 数值不等
    -gt 大于
    -lt 小于
    -ge 大于等于
    -le 小于等于

  • 判定字符串的数据:
    -z 长度为0,返回0(true),否则返回1(false)
    -n 长度不为0,返回0(true),否则返回1(false)

  • 多重条件判定
    -a 同事满足(and)
    -o or
    ! 取反 test ! -x file

利用判断符号”[]”

比如我们想要知道$HOME这个变量是否为空
[-z "$HOME" ] ; echo $?
bash语法中使用中括号作为shell的判断式时,必须要注意中括号的两端需要有空格符来分隔
需要空格的位置见下例:(□代表空格)
[□"HOME"□==□"$MAIL"□]
注:bash中两个变量做”判断”时,可以用一个等号,也可以用两个等号”==”

总结:

  • 在中括号[]内的每个组件都需要空格键来分隔;
  • 在中括号捏的变量,最好都以双引号括号起来;
  • 在中括号内的常量,最好都以单或双引号括号起来。

原因:变量或常量中可能含有空格

shell script的默认变量($0,$1…)

示例脚本的文件名为:sh08.sh

#!/bin/bash# Program:#       Program shows the script name, parameters...# History:# 2016/05/11  Hanzhou   First releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHecho "Total parameter number is ==> $#"echo "Your whole patameter is ==> '$@'"shiftecho "Total parameter number is ==> $#"echo "Your whole patameter is ==> '$@'"shift 3echo "Total parameter number is ==> $#"echo "Your whole patameter is ==> '$@'"shift

脚本执行结果见下

hanzhou@hanzhou-VirtualBox:~/main/charpter13_learn_shell_script$ bash sh08.sh  1 2 3 4 5 6 7 Total parameter number is ==> 7Your whole patameter is ==> '1 2 3 4 5 6 7'Total parameter number is ==> 6Your whole patameter is ==> '2 3 4 5 6 7'Total parameter number is ==> 3Your whole patameter is ==> '5 6 7'
  • shift n 意为拿掉前n个参数

13.4条件判断式

if…then

  • 单层、简单条件判断式
if [条件判断式]; then    当条件判断式成立时,可以进行的命令工作内容;fi <== 结束if之意

有多个条件要判别时

  • &&代表 AND;
  • ||代表 or。

  • 多重、复杂条件判断式

if [条件1]; then    执行内容elif [条件2]; then    执行内容else    执行内容fi

利用 case…esac 判断

其实就是我们所熟知的case when
语法如下:

case $变量名称 in"第一个变量内容") ##每个变量内容建议用双引号,关键词则为小括号程序段;; ##每个类型结尾使用两个连续的分好来处理!"第二个变量内容")程序段;;*) ##最后一个变量内容都会用*来代表所有其他值程序段exit 1;;esac

利用 function 功能

语法如下:

function fname{         程序段}

fname就是我们的自定义的执行命令名称,而程序段就是我们要它执行的内容。

13.5循环(loop)

while do done,until do done(不定循环)

语法:

while [ condition ]do    程序段落done
unitl [ condition ]do    程序段落done

for…do…done( 固定循环 )

for var in con1 con2 con3 ...do     程序段done

for…do…done的数值处理

语法

for (( 初始值; 限制值; 执行步长))do    程序段done

shell script的追踪与调试

sh [-nvx] script.sh
参数

  • -n: 不要执行script,仅查询语法问题;
  • -v:执行script前,先将script的内容输出到屏幕上;
  • -x:将使用到的script内容显示到屏幕加上。
0 0
原创粉丝点击