美文网首页
学习shell script

学习shell script

作者: Zhang21 | 来源:发表于2017-04-26 10:42 被阅读116次

基本上,shell script 有点像早期的批处理程序,即将一些命令汇整起来一次执行,但shell script拥有更强大的功能,他可以进行类似程序(program)的编写,并且不需要经过编译(compile)就能执行,真的很方便。

1、什么是shell script

shell,就是一个命令行界面下面让我们与系统沟通的一个工具接口;script,字面上script是脚本的意思。换句话说,shell script是针对shell所写的脚本。

shell script是利用shell的功能所能写的一个程序(program),这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、命令管道与数据流重定向等功能,还提供了数组、循环、条件与逻辑判断等重要功能, 以达到我们所想要的处理目的。

shell script用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上,就不够好了,因为shell script的速度较慢,且使用的cpu资源较多,造成主机资源的分配不良。

使用shell script优势:

自动化管理的重要依据;

追踪与管理系统的重要工具;

简单入侵检测功能;

连续命令单一化;

简单的数据处理;

跨平台支持与学习历程较短;

shell script的编写中的注意事项:

命令的执行是从上到下,从左到右分析与执行;

命令的执行中:命令、参数间的多个空白都会被忽略掉;

空白行也将被忽略,并且[tab]按键所得的空白同样视为空格键;

如果读取到一个Enter符号(CR),就尝试开始执行该行命令;

如果一行内容太多,则可以使用“\[Enter]"来扩展到下一行;

"#"可以作为注释,任何加在#后面的内容都将被视为注释而被忽略。

shell script文件的执行方式:

直接命令执行:xxx.sh文件必须具有可读(r)和可执行(x)权限,然后使用 绝对路径 或 相对路径 来执行命令;

以bash进程来执行: bash  xxx.sh;

script执行方式的区别:source、shscript、./script

利用直接执行的方式来执行script;使用这种执行方式时,script是在子进程的bash内执行的,当子进程完成后,子进程内的各项变量或操作将会结束而不会传回到父进程中。

利用source来执行脚本:在父进程中执行

在子进程中运行



在父进程中运行




编写第一个script:

#!/bin/bash    #声明script使用的shell

#program:    #程序内容说明

#        This program shows "Hello World!" in your screen.

#History:

#2017.04.24  Zhang  First release

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin    #主要环境变量的声明

export PATH

echo -e "Hello World !\n"    #主要程序部分

exit 0    #告知执行结果

良好的script编写习惯,在每个scripted的文件头处记录好:

script的功能;

script的版本信息;

script的作者;

script的版权声明方式;

script的History(历史记录);

script内较特殊的命令,使用“绝对路径”的方式来执行;

script执行时需要的环境变量预先声明与设置。

在较为特殊的程序代码部分,建议务必要加上批注说明。

利用test命令的测试功能:

当我要检测系统上某些文件或者是相关属性时,利用test这个命令来工作真是太好了。

test  -e  /abc.txt  &&  echo "exist"  ||  echo "Not exist"

利用判断符号[ ]:

如果需要在bash中使用中括号来作为shell的判断式时,必须要注意中括号的两端需要有空格符来分隔;

中括号内的变量,每个最好都已双引号括起来;

中括号内的常量,最好都以单或双引号括起来。

shell script的默认变量:$0,$1...

script是如何实现这个功能的呢?其实script针对参数已经有设置好一些变量名称了!

script的默认参数

执行文件的脚本名就是$0,第一个接的参数就是$1。所以,只要在script里面善用$1的话,就可以很简单地立即执行某些命令功能。

$#:代表后接的参数“个数”;

$@:代表“$1","$2","$3"之意,每个变量是独立的(用双引号括起来);

$*:代表“$1c$2c$3c”,其中c为分割字符,默认为空格键,即为“$1 $2 $3"之意。

shift:造成参数变量号码偏移

shift会移动变量,而且shift后面可以接数字,代表拿掉最前面的几个参数的意思。

条件判断式

1、if...then

if...then 是最常见的条件判断式。简单地说,就是当符合某个条件判断的时候,就进行某项工作。

单层、简单条件判断式:

&&代表and;

|| 代表or;

if  [条件判断式];then

    当条件判断式成立时,可以进行的命令工作内容;

fi  #结束 if 

多重、复杂条件判断式:

if  [条件判断式];then

 xxxx

else

xxxx

fi

if  [condition1];then

xxxx

elif  [condition2];then

xxxx

else

xxxx

fi

2、case...esac判断

有多个既定变量内容,那么只需要针对这几个变量来设置状况就好了。

case  $变量名称  in

"第一个变量内容“)

xxxx

;;    #表示该程序段落的结束

”第二个变量内容“)

xxxx

;;

*)

xxxx

;;

esac    #表示结束case判断

其实系统的很多服务的启动script都是使用这种写法的。如/etc/init.d/networ 

/etc/init.d/network    #这样是交互式

用法:/etc/init.d/network {start|stop|status|restart|reload|force-reload}

/etc/init.d/network status    #这样是直接执行式

3、function功能

什么是function(函数)功能?简单地说,其实,函数可以在shell script 当中做出一个类似自定义执行命令的东西,最大的动能是,可以简化我们很多的程序代码。

function  fname() {

程序段

}

要注意的是,因为shell script的执行方式是由上而下、由左而右,因此在shell script当中的function的设置一定要在程序的最前面,这样才能够在执行时被找到可用的程序段。它不但可以简化程序代码,而且可以做成类似模块的玩意儿,真的很不错!

#!/bin/bash

#Program:

#      Use function to repeat information.

#History:

#20170425      zhang21_

function printit() {

echo -n "Your choice is "      #-n表示不断行显示

}

echo "This program will print your selection !"

case $1 in

"one")

printit; echo $1 | tr 'a-z' 'A-Z'      #将输出小写转换为大写

;;

"two")

printit 2

;;

*)

echo "Usage $0 {one|two}"

;;

esac

循环(loop)

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

while  [ condition 1 ]

do

  程序段落

done

while 是当 condition条件成立时,就进行循环,知道condition的条件不成立才停止。

until 是当condition条件成立时,就终止循环,否则就持续进行循环的循环。两者刚好相反。

until  [ condition 2 ]

do

 程序段落

done

2、for  do  done(固定循环)

for  xxx  in  con1 con2 con3 ...

do

      程序段

done

for do  done 的数值处理:

for  ((初始值;限制值;执行步长))

do

    程序段

done

初始值:某个变量在循环当中的初始值,直接以类似 i=1 设置好;

限制值:当变量的值在这个限制值的范围内,就继续进行循环,例如 i<=100;

执行步长:每做一次循环时变量的变化量,如 i=i+1

[root@www scripts]#vi sh19.sh#!/bin/bash

# Program:

# Try do calculate 1+2+....+${your_input}

# History:

# 2005/08/29 VBird First release

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

read -p "Please input a number, I will count for 1+2+...+your_input: " nu

s=0

for (( i=1; i<=$nu; i=i+1 ))

do

s=$(($s+$i))

done

echo "The result of '1+2+3+...+$nu' is ==> $s"

shell script的追踪与调试

script在执行之前,最怕的就是出现语法错误的问题了!那么我们如何调试呢?

script调试

至于在shell script的学习方法上面,需要多看、多模仿并加以修改成自己的样式!这是最快的学习手段!

重点回顾:

shell script是利用shell的功能所写的一个”程序(program)”,这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能,以达到我们所想要的处理目的;

shell script用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上就不够好了,因为shell script的速度较慢,且使用的CPU资源较多,造成主机资源的分配不良;

在shell script的文件中,命令是从上而下、从左而右地分析与执行;

shell script的执行至少需要有 r 权限,若需要直接执行命令,则需要拥有 r 与 x 权限;

在良好的程序编写习惯中,第一行要声明shell(#!/bin/bash),第二行以后则声明程序用途、版本、作者等;

对谈式脚本可用 read 命令达成;

要创建每次执行脚本都有不同结果的数据,可使用 date 命令利用日期达成;

script的执行若以source来执行时,代表在父进程的 bash 内执行之意;

若需要进行判断式,可使用 test 或中括号 [ ] 来处理;

在script内,$0、$1、$2...,$@是有特殊含义的;

条件判断式可使用 if...then 来判断,若是固定变量内容的情况下,可使用 case $var  in ... esac来处理;

循环主要分为不定循环(while,until)以及固定循环(for),配合 do、done来达成所需任务;

我们可使用 sh -x script.sh 来进行程序的调试。

相关文章

网友评论

      本文标题:学习shell script

      本文链接:https://www.haomeiwen.com/subject/pldpzttx.html