学习shell script

基本上,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 来进行程序的调试。

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

推荐阅读更多精彩内容