简述Shell脚本

              shell是一个用C语言编写的应用程序,它是一种命令语言又是一种程序设计语言。shell脚本(shell script)是一种为shell编写的脚本程序,它与Windows下的批处理相似,用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,在Shell 中可以调用Linux 系统命令。

                  shell脚本和java编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux的shell种类众多,常见的有:

Bourne Shell(/usr/bin/sh或/bin/sh)

Bourne   Again Shell(/bin/bash)

C  Shell(/bin/csh)等等

(常见的编程语言分为两类:一个是编译型语言,如java,运行前要经过编译器的编译;另一个是解释型语言,执行时,需要使用解释器一行一行的转换为代码,如:python,shell)

第一个shell脚本

用vi或vim命令新建文件first.sh,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意即可

vim first.sh

#!/bin/bash

echo“hello world!”

#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种shell

echo命令用于向窗口输出文本

执行脚本有两种方式:

一、  作为可执行程序执行

1、  首先要赋予脚本具有执行权限

chmod u+x first.sh

2、  输入脚本的相对路径或绝对路径执行脚本

./first.sh  #执行脚本

或者从根目录开始用绝对路径执行脚本



二、 作为解释器参数执行

直接运行解释器,其参数就是shell脚本的文件名

sh  first.sh


以这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

shell中的变量

linux中的变量分为系统变量和用户自定义变量,系统变量有:$PWD,$HOME,$USER等等,可以用set命令查看当前shell中的所有变量(包括系统的和用户自定义的)

定义变量:

语法:变量=值

变量命名只能使用英文字母,数字和下划线,首字母不能以数字开头

变量名称中间不能有空格,可以使用下划线_

等号两侧不能有空格

变量名称一般习惯大写

不能使用标点符号

不能使用bash里的关键字(可用help命令查看保留关键字)

使用变量:

只需要在一个定义过的变量前加美元符号$即可使用,如下:


使用readonly命令可以将变量定义为只读变量,只读变量的值

readonly  country=”china”

country=“china“

readonly  country

unset  A    撤销变量A,unset命令不能删除只读变量

export   变量名    可以把变量提升为全局变量,可供其它shell程序使用

运行shell时,会同时存在三种变量:

1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

位置参数变量

$0  当前脚本的文件名

$n 传递给脚本或函数的参数。n为数字,表示第几个参数,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}

$* 传递给脚本或函数的所有参数

$@  传递给脚本或函数的所有参数。

$# 传递给脚本或函数的参数个数

$* 和 $@ 的区别为: $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号("")包含时,都以"$1" "$2" …"$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 …$n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1""$2"… "$n" 的形式输出所有参数

案例

打印输入的参数总数,所有参数



预定义变量

$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

$$ (功能描述:当前进程的进程号(PID))

$! (功能描述:后台运行的最后一个进程的进程号(PID))

变量替换

可以根据变量的状态(是否为空,是否定义等)来改变它的值


命令替换:

把一个命令的输出赋值给一个变量,方法为把命令用反引号(在Esc键下方)引起来

directory=`pwd`

echo $directory

运算符

语法:1、$((运算式))或$[运算式]

      2、expr m + n           注意expr运算符与表达式间要有空格,否则错误

案例:计算(2+3)* 4的值

(1)采用$[运算式]方式

S=$[(2+3)*4]

echo $S

(2) expr分布计算

S=`expr2 + 3`

expr  $S \* 4

#在expr中乘号为:\*

(3) expr一步完成计算

expr `expr 2 +3` \* 4

案例:

计算输入的参数 1 和参数 2 的两个数的和,并输出到控制台


注意执行脚本的时候后面带参数

判断语句

语法:[ 条件式 ]   

注意 条件式前后要有空格

非空返回true,可使用$?验证(0为true,>=1为false)

案例


按照文件权限进行判断

   -r  有读的权限

   -w  有写的权限

   -x  有执行的权限

按照文件类型进行判断

  -f文件存在并且是一个常规的文件

  -e文件存在

  -d文件存在并是一个目录

案例


算术运算符

假定变量 a 为 10,变量 b 为20


在[ $a == $b ]与[ $a != $b ]中,需要在方括号与变量以及变量与运算符之间有括号,否则为错误的

关系运算符

只支持数字,不支持字符串


布尔运算符


逻辑运算符:


字符串运算符:


文件测试运算符


Shell中的字符串

字符串可以用单引号也可以用双引号表示,区别如下:

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可以成对出现,作为字符串拼接使用

双引号中可以有变量,可以出现转义字符

拼接字符串:


获取字符串的长度:

str=”abcd”

echo ${#str}   #输出4

提取子字符串:

str=”hello world”

echo ${str:1:3}   #输出ell

从字符串第2个字符开始截取3个字符

查找子字符串:

查找字符i或s的位置(哪个字母先出现就计算哪个)

str=”the sky is blue”

echo `expr index “$str” is`  #输出5

Shell数组

bash支持一维数组,不支持多维数组,并且没有限定数组大小,数组下标由0开始,利用下标获取数组元素

语法:数组名=(值1  值2  值3 …… 值n)

用括号表示数组,数组元素用空格分割开

eg:array_name=(value1  value2 value3)

或array_name[0]=value1

array_name[1]=value2

array_name[2]=value3

array_name[n]=valuen

可以不使用连续的下标,而且下标的范围没有限制

读取数组:

读取数组元素值的一般格式为:

${数组名[下标]}           eg:${array_name[0]}

使用@或*符号可以获取数组中的所有元素  

eg:  echo  ${array_name[@]}或echo  ${array_name[*]}

获取数组的信息:

获取数组的长度:

length=${#array_name[@]}或length=${#array_name[*]}

获取数组的下标:

length=${!array_name[@]}或length=${!array_name[*]}

获取数组单个元素的长度

length1=${#array_name[1]}

Shell注释

单行注释前面加#即可

#这是一行注释

多行注释

1、    可以用一对花括号将要注释的代码括起来,定义成函数,没有地方调用这个函数,这块代码就不会执行,达到和注释一样的效果

2、    格式如下

:<<EOF

注释内容……

注释内容……

…………

注释内容……

EOF

其中EOF也可以使用其他符号,如下:

:<<‘

注释内容……

注释内容……

Shell中的echo命令:

echo命令用于字符串的输出,语法:echo  string

可用echo实现更复杂的输出格式控制

1、显示普通字符串

echo “It is a test”或echo  it is a test  (这里双引号可省略,效果一样)

2、显示转义字符

echo  “\“the skyis blue\””     #输出为”the sky is blue”

echo中可以用于的转义符有:

转义字符    含义

\\                反斜杠

\a               警报,响铃

\b               退格(删除键)

\c               不换行

\f                换页(FF),将当前位置移到下页开头

\n                换行

\r                回车

\t                水平制表符(tab键)

\v                垂直制表符

使用echo命令的-E选项禁止转义,使用-n选项可以禁止插入换行符,使用-e选项可以进行转义


3、 显示结果定向至文件

echo  “hello  world” >>hello.txt

意为将hello  world输入到hello.txt文件中

4、   显示命令执行结果

echo  `date`

注意:这里使用的是反引号,而不是单引号,结果将显示当前系统日期

Shell中的流程控制

if判断

基本语法:([ 条件判断式 ] if 和中括号和条件判断式之间必须有空格)

1、if  [  条件判断式  ];then

               #程序

    fi

或者if  [  条件判断式  ]

      then     #程序

     fi

2、if [ 条件判断式]

then   #程序

else 

      #程序

fi

3、   if [条件判断式]

        then   #程序

      elif [条件判断式]

        then   #程序

      else

            #程序

      fi

 案例


case语句

基本语法:

case $变量名in

"值1")

#如果变量的值等于值1,则执行程序1

;;

"值2")

#如果变量的值等于值2,则执行程序2

;;

…省略其他分支…

*)

#如果变量的值都不是以上的值,则执行此程序

;;

esac

取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令

案例:


for循环

基本语法:

1、 for 变量in 值1 值2 值3…

      do

               #程序

       done

注意:列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量

当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。in列表是可选的,如果不用它,for循环使用命令行的位置参数。


2、   for((初始值;循环控制条件;变量变化))

             do

                        #程序

            done

案例


while循环

基本语法:

while [ 条件判断式 ]

 do

             #程序

done

while((条件表达式))

     do

              #程序

     done

案例


until循环

until循环执行一系列命令直至条件为 true 时停止,与 while 循环在处理方式上刚好相反。   

基本语法:

until condition

do

   command

done

condition一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。 

shell中的break和continue

shell也支持break和continue,和其他编程语言用法一样,在循环中可使用 break 与continue 跳出循环,另外,break 命令后面还可以跟一个整数,表示跳出第几层循环。

read读取控制台输入

基本语法:

read(选项)(参数)

选项

-p:指定读取值时的提示符;

-t:指定读取值时等待的时间(秒)。

参数

变量:指定读取值的变量名


函数

系统函数

1、  basename基本语法

basename [pathname] [suffix]

basename [string] [suffix]

(功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

选项

suffix 为后缀,如果suffix 被指定了,basename 会将pathname 或string 中的suffix 去掉

 basename /home/yin/1.txt          -> 1.txt

 basename  /home/yin/1.txt    .txt       -> 1

2、  dirname基本语法

dirname  文件绝对路径  

从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)


dirname /usr/bin/          -> /usr

dirname stdio.h            -> .

自定义函数

基本语法(function关键字可加可不加)

function 函数名()

{

    #程序

}

调用函数:函数名 参数1 参数2 ……

注意:

在函数体内部,通过$n的形式来获取参数的值,如$1表示第一个参数,$2表示第二个参数……

必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。

shell函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其它值表示失败,只能通过$?系统变量获得,可以显示加:return返回,如果不加, 将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)


删除函数也可以使用unset命令,不过要加上.f选项

unset  .f  function_name

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

推荐阅读更多精彩内容