Linux之Shell脚本编程(二)


        在上一篇博文中,主要介绍了Shell脚本编程的背景,怎样创建人生中第一个Shell脚本以及Shell变量等内容。接下来将接着介绍介绍Shell编程,主要是围绕着Shell运算、流程控制语句、自定义函数以及脚本调试等方面展开。

一、运算符

例:
  num1=11
  num2=22
  sum=num1+num2
  echo $sum

格式 : expr m + n 或$((m+n)) 注意expr运算符间要有空格
  expr命令:对整数型变量进行算术运算 (注意:运算符前后必须要有空格)
  expr 3 + 5
  expr 3 – 5
  echo `expr 10 / 3`
  10/3的结果为3,因为是取整
  expr 3 * 10 注意: \ 是转义符

image.png

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

1 .分步计算
   S=`expr 2 + 3`
   expr $S * 4

2.一步完成计算
  expr `expr 2 + 3` * 4
  S=`expr `expr 2 + 3` * 4`
  echo $S
  或
  echo $(((2 + 3) * 4))


image.png

$()与${}的区别
  $( )的用途和反引号``一样,用来表示优先执行的命令
    eg:echo $(ls test.sh)
  就是取变量了eg:echo{PATH}
  $((运算内容)) 适用于数值运算
    eg: echo $((3+1*4))

二、内置test命令

内置test命令常用操作符号[]表示,将表达式写在[]中,如下:
    [ expression ]
  或者:
    test expression
  注意:expression首尾都有个空格
    eg: [ ] ;echo $?
  测试范围:整数、字符串、文件
  表达式的结果为真,则test的返回值为0,否则为非0。当表达式的结果为真时,则变量$?的值就为0,否则为非0

1.字符串测试:

       test str1 == str2    测试字符串是否相等
  test str1 != str2   测试字符串是否不相等
  test str1        测试字符串是否不为空,不为空,true,false
  test -n str1      测试字符串是否不为空
  test -z str1      测试字符串是否为空
    eg:
      name=linzhiling
      [ “$name” ] && echo ok
      ; 命令连接符号
      && 逻辑与 条件满足,才执行后面的语句
      [ -z “$name” ] && echo invalid || echo ok
      || 逻辑或,条件不满足,才执行后面的语句
      test “$name” == ”yangmi” && echo ok || echo invalid


image.png
2.整数测试:

       test int1 -eq int2   测试整数是否相等 equals
  test int1 -ge int2   测试int1是否>=int2
  test int1 -gt int2    测试int1是否>int2
  test int1 -le int2    测试int1是否<=int2
  test int1 -lt int2     测试int1是否<int2
  test int1 -ne int2   测试整数是否不相等
    eg:
      test 100 –gt 100
      test 100 –ge 100
  如下示例两个变量值的大小比较:


image.png
3.文件测试:

       test -d file      指定文件是否目录
  test –e file     文件是否存在 exists
  test -f file       指定文件是否常规文件
  test –L File    文件存在并且是一个符号链接
  test -r file       指定文件是否可读
  test -w file      指定文件是否可写
  test -x file       指定文件是否可执行
    eg:
      test -d install.log
      test –r install.log
      test –f xx.log ; echo $?
      [ -L service.soft ] && echo “is a link”
      test -L /bin/sh ;echo $?
      [ -f /root ] && echo “yes” || echo “no”

4.多重条件测试:

       条件1 –a 条件2 逻辑与 两个都成立,则为真
  条件1 –o 条件2 逻辑或 只要有一个为真,则为真
  ! 条件 逻辑非 取反
  eg:
    num=520
    [ -n “num”–a“num” –ge 520 ] && echo “marry you” || echo “go on”
    age=20
    pathname=outlog
    [ ! -d“$ pathname”] && echo usable || echo used

image.png

三、流程控制语句

1.if/else 命令

单分支if条件语句
       if [ 条件判断式 ]
    then
      程序
  fi
  或者
  if [ 条件判断式 ] ; then
     程序
  fi
  eg:
  #!/bin/sh
  if [ -x /etc/rc.d/init.d/httpd ]
    then
        /etc/rc.d/init.d/httpd restart
  fi
单分支条件语句需要注意几个点:
  if语句使用fi结尾,和一般语言使用大括号结尾不同。
  [ 条件判断式 ] 就是使用test命令判断,所以中括号和条件判断式之间必须有空格
  then后面跟符号条件之后执行的程序,可以放在[]之后,用“;”分割,也可以换行写入,就不需要";"了。

image.png

多分支if条件语句
  if [ 条件判断式1 ]
    then
    当条件判断式1成立时,执行程序1
  elif [ 条件判断式2 ]
    then
    当条件判断式2成立时,执行程序2
  ...省略更多条件
  else
    当所有条件都不成立时,最后执行此程序
  fi

示例:
  eg:
  #!/bin/bash
  read -p "please input your name:" NAME
  #echo $NAME
  if [ “$NAME” == root ]
    then
      echo "hello ${NAME}, welcome !"
  elif [ $NAME == tom ]
    then
      echo "hello ${NAME}, welcome !"
  else
      echo "SB, get out here !"
  fi


image.png
2.case in 命令

       case命令是一个多分支的if/else命令,case变量的值用来匹配value1,value2,value3等等。匹配到后则执行跟在后面的命令直到遇到双分号为止(;;)case命令以esac作为终止符。


image.png
3.for 循环

       for循环命令用来在一个列表条目中执行有限次数的命令。比如,你可能会在一个姓名列表或文件列表中循环执行同个命令。for命令后紧跟一个自定义变量、一个关键字in和一个字符串列表(可以是变量)。第一次执行for循环时,字符串列表中的第一个字符串会赋值给自定义变量,然后执行循环命令,直到遇到done语句;第二次执行for循环时,会右推字符串列表中的第二个字符串给自定义变量,依次类推,直到字符串列表遍历完。
  第一种:
  for N in 1 2 3
    do
    echo $N
  done
  第二种:
  for ((i = 0; i <= 5; i++))
    do
    echo "welcome $i times"
  done

4.while 循环

       while命令根据紧跟其后的命令(command)来判断是否执行while循环,当command执行后的返回值(exit status)为0时,则执行while循环语句块,直到遇到done语句,然后再返回到while命令,判断command的返回值,当得打返回值为非0时,则终止while循环。
  格式
  while expression
    do
    command
    …
  done
实例:求1-10各个数的平方?


image.png
5.函数

       函数代表着一个或一组命令的集合,表示一个功能模块,常用于模块化编程。
  以下是关于函数的一些重要说明:
    在shell中,函数必须先定义,再调用
    使用return value来获取函数的返回值
    函数在当前shell中执行,可以使用脚本中的变量。
结构
完整:
  function name() {
    statements
    [return value]
  }
建议:
  function name {
    statements
    [return value]
  }
函数调用
  调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可:
    name
  如果传递参数,那么多个参数之间以空格分隔:
    name param1 param2 param3
注意:
1)不管是哪种形式,函数名字后面都不需要带括号。
2)和其它编程语言不同的是,Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。
3)Shell 也不限制定义和调用的顺序,你可以将定义放在调用的前面,也可以反过来,将定义放在调用的后面。

image.png

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