bash脚本语言,不同于C/C++是一种解释性语言。即在执行前不需要事先转变为可执行的二进制代码,而是每次执行时经解释器解释后执行。bash脚本语言是命令的堆砌,即按照实际需要,结合命令流程机制实现的源程序,因此他学习起来要比C/C++简单的多。

  1.bash中的变量

    bash中的变量分为本地变量,局部变量和环境变量等

      本地变量:使用格式为varname=值,本地变量的声明周期为整个脚本进程

      局部变量:使用格式为local varname=值,局部变量的声明周期为整个脚本进程

      环境变量:使用格式为export varname=值,作用域为当前shell进程及子进程。命令脚本在执行时,会启动shell的子进程,命令行中启动的脚本会继承当前的shell环境变量,系统自动执行脚本(非命令行启动)就需要自我定义环境变量

      位置变量:$1,$2...表示引用的参数

          shift:踢出参数  shift n:表示踢出n个参数

      特殊变量:$?保存了上一个命令执行的状态返回值(程序执行可能有两类返回值,一种是执行的状态返回值,一种是执行命令的返回值)

          程序状态返回代码:(0-255)

          0:表示执行正确

          1-255:都是错误的

    

    撤销变量:uset 变量名称

    查看当前shell中的变量:set命令

    查看当前shell中的环境变量:printenv,env,export

    在原来的值后面补加一个值:

      ANIMALS=pig

      ANIMALS=$ANIMALS:gost

      执行结果:pig:gost

    注意:变量名称只能包含字母、数字和下划线,并且不能以数字开头,不应该跟系统中已有的环境变量重名,最好做到见名知意。

    2.bash中的条件判断

      条件测试类型:

        整数测试,字符测试,文件测试

      条件测试的表达式:

        [ express ]:注意括号两侧有空格,括号中的表达式是关键字

        [[express]

      怎么写一个条件表达式:

        整数比较:

          -eq:测试两个整数是否相等,$A -eq $B

          -ne:测试两个整数是否不等,不等为真,相等为假

          -gt:测试一个数是否大于一个数,大于为真,小于为假

          -lt:测试一个数是否小于一个数,小于为真,大于为假

          -ge:大于或等于

          -le:小于或等于

        文件测试:

          -e 文件名/文件路径 测试文件是否存在

          -f 文件名/文件路径 测试文件是否为普通文件

          -d 文件名/文件路径 测试文件是否是目录

          -r 文件名/文件路径  测试文件是否是可读的

          -w 文件名/文件路径 测试文件是否是可写的

          -x 文件名/文件路径 测试当前用户是否可读可写可执行

    练习:给定一个文件,如果是一个普通文件,就显示之;如果是一个目录也显示之,否则就显示无法识别这个文件。
    #!/bin/bash
    FILE=/etc/inittab
    if [ ! -e $FILE ];then
    echo "No such file."
    exit 6
    elif [ -f $FILE ];then
    echo "common file"
    elif[ -d $FILE ];then
    echo "directory"
    else
    "unknown"
    fi

    3.命令件的逻辑关系

      逻辑与:&&

        第一个条件为假时,第二个条件不用再判断,最终结果已经有;

        第一个条件为真,第二个条件必须得判断

      逻辑或:||

        只要有一个条件为真即可

      eg:

        user1存在就输出hello student

          id user1 &> /dev/null&&echo "hello student"

        如果user6不存在,就添加用户user6

          !id user6&&useradd user6

          id user6||useradd user6

        如果用户存在,就显示此用户否则就添加此用户

          id user1&&useradd user1||echo "user1 exits"

        如果用户不存在,就添加,否则显示已存在

           !id user1&&useradd user1||echo "user1 exits"  

        如果用户不存在,添加并且给密码;否则显示其已经存在

          !id user1&&useradd&&echo "user1"|passwd --stdin user1||echo "user1 exits"  //使用管道给user1添加密码

    4.在shell中进行运算

      1.使用let命令做运算:let C=$A+$B

      2.$[算数运算表达式]:C=$[$A+$B]

      3.$((运算表达式)):C=$(($A+$B))

      4.expr算数运算表达式,表达式中各操作及运算符之间要有空格,而且要使用反引号将命令引用

        C=`expr $A+$B`

    5.条件判断控制结构    

    单分支的if语句:
      if 判断条件; then
      statement1
      statement2
      fi
 
    双分支的if语句:
      if 判断条件; then
      statement1
      statement2
      else
      statement3
      statement4
      fi
 
    多分支的if语句
      if 判断条件;then
      statement1
      ...
      elif 判断条件;then
      statement2
      ...
      elif 判断条件;then
      statement3
      ...
      else
      statement4
      ...
      fi
    

    练习:如果用户已存在,则显示存在,如果不存在添加用户
      if id $NAME &> /dev/null;then //&> /dev/null 表示不显示输出信息,&> 为重定向
      echo "$NAME exits"
      else
      useradd $NAME
      echo $NAME|passwd --stdin $NAME &> /dev/null //为用户设定密码
      echo "Add $NAME finish"
      fi
 
    练习:写一个脚本
      给定一个文件,比如/etc/inittab,判断这个文件中是否有空白行;如果有,则显示其空白行数;否则显示没有空白行
      #!/bin/bash
      $FILE=/etc/inittab
      if grep "^$" &> /dev/null;then //使用正则表达式来判断是否有空白行
        echo "total blank lines `grep "^$" $FILE|wc -l`" //使用管道计算
      else
        echo "No blank lines"
      fi
 

      练习:写一个脚本

        判断当前系统上是否有用户默认shell为bash,如果有,就显示其中的一个用户名,否则就显示没有这类用户

          #!/bin/bash

          grep "/<bash$" /etc/passwd &>/dev/null

          RETVAL=$?    //上一条命令的执行状态码,为0表示执行成功,否则失败

          if [ $RETVAL -eq 0 ];then

            AUSERS=`grep "\<bash$" /etc/passwd|head -1|cut -d: -f1`  //显示用户名

            echo "$AUSERS is one of such user"

          else

            echo "no such user"

          fi

    

    6.选择结构case语句
    case SWITCH in
    value1)
    statement
    ...
    ;; //以双分号结尾
    value2)
    statement
    ...
    ;;
    *)
    statement
    ...
    ;;
   esac
 
练习:写一个脚本
传递一个参数,判断这个参数是数字还是字母还是特殊字符
#!/bin/bash
case $1 in
[ 0-9 ])
echo "Adigit";;
[ a-z ])
echo "Lower";;
[ A-Z ])
echo "Upper";;
*)
echo "Special charactor";;
esca
 
  练习:写一个脚本
  只接受参数start,stop,restart,status其中之一,如果传入的不是这四个参数则提示
    #!/bin/bash
    case $1 in
    'start')
    echo "start";;
    'stop')
    echo "stop";;
    'restart')
    echo "restart";;
    'status')
    echo "status";;
    *)
    //echo "please input start or stop or restart or status"
    echo "`basename $0` {start|stop|restart|status}";;
    esac
    7.bash脚本的结构
      顺序结构
      选择结构
        if
        case
      循环结构
        for
        while
        until
 

for循环:
for 变量 in 列表;do //形式1
statement
done
 
for ((expr1;expr2;expr3));do //形式2,近似于C语言
list
done
 
练习:计算1-100以内正整数的和;
#!/bin/bash
declare -i SUM=0
for I in [1-100];do
let SUM+=$I
done
echo $SUM
 
#!/bin/bash
declare -i SUM=0
for ((I=1;I<=100;I++));do
let SUM+=$I;
done
echo $SUM
while循环:
  while CONDTION;do
  statement
  done
进入循环,条件满足
退出条件,条件不满足
 
until循环: //形式跟while一样,但是进入退出循环条件刚好相反
  until CONDITION;do
  statement
  done
进入循环,条件不满足
退出循环,条件满足
  

练习:写一个脚本
要求用户输入一条信息,将里面的小写字符全部换成大写的
#!/bin/bash
read -p "Input something" STRING
while [ $STRING != 'quit' ];do
echo $STRING|tr 'a-z' 'A-Z'
read -p "Input something,again" STRING
done
 
#!/bin/bash
read -p "Input something" STRING
until [$STRING == 'quit' ];do
echo $STRING|tr 'a-z' 'A-Z'
read -p "Input something,again" STRING
done
 
练习:写一个脚本
每隔5秒钟查看hadoop是否登录,如果登录就退出,否则一直执行
#!/bin/bash
who|grep "hadoop" &>/dev/null
RETVAL=$?
while [ $RETVAL -ne 0 ];do //没登录
echo "`data`,hadoop is not logged"
sleep 5
who|grep "hadoop" &>/dev/null
RETVAL=$?
done
echo "hadoop is logged in"
 
#!/bin/bash
who|grep "hadoop" &> /dev/null
RETVAL=$?
until [ $RETVAL -eq 0 ];do //没登录
echo "`data`,hadoop is not logged"
sleep 5
who|grep "hadoop" &> /dev/null
RETVAL=$?
done
echo "hadoop is logged in"
 
8.循环控制的方法
    在while,until , for循环结构中
      break:提前退出循环
      continue:提前进入下一轮循环
练习:写一个脚本计算1-100以内奇数得和
  #!/bin/bash
  let SUM=0
  let I=0
  while [ $I -lt 100 ];do
  let I++
  if [ $[$I%2] -eq 0 ];then
  continue; //如果是偶数则提前进入下一轮循环
  fi
  let SUM+=$I
  done
echo $SUM

          

    

bash脚本编程学习笔记(一)的更多相关文章

  1. Bash脚本编程学习笔记08:函数

    官方资料:Shell Functions (Bash Reference Manual) 简介 正如我们在<Bash脚本编程学习笔记06:条件结构体>中最后所说的,我们应该把一些可能反复执 ...

  2. Bash脚本编程学习笔记07:循环结构体

    本篇中涉及到算术运算,使用了$[]这种我未在官方手册中见到的用法,但是确实可用的,在此前的博文<Bash脚本编程学习笔记03:算术运算>中我有说明不要使用,不过自己忘记了.大家还是尽量使用 ...

  3. Bash脚本编程学习笔记06:条件结构体

    简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式. if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现, ...

  4. Bash脚本编程学习笔记04:测试命令test、状态返回值、位置参数和特殊变量

    我自己接触Linux主要是大学学习的Turbolinux --> 根据<鸟哥的Linux私房菜:基础篇>(第三版) --> 马哥的就业班课程.给我的感觉是这些课程对于bash的 ...

  5. Bash脚本编程学习笔记05:用户交互与脚本调试

    用户交互 在<学习笔记04>中我们有提到位置参数,位置参数是用来向脚本传递参数的一种方式.还有一种方式,是read命令. [root@c7-server ~]# read name alo ...

  6. bash脚本编程学习笔记(二)

    1.脚本编程之函数 函数是实现结构化编程重要的思想,主要目的是实现代码重用 定义一个函数: function FUNCNAME { command //函数体 }   FUNCNAME(){ //函数 ...

  7. Linux Shell脚本编程学习笔记和实战

    http://www.1987.name/141.html shell基础 终端打印.算术运算.经常使用变量 Linux下搜索指定文件夹下特定字符串并高亮显示匹配关键词 从键盘或文件里获取标准输入 [ ...

  8. shell脚本编程学习笔记(一)

    一.脚本格式 vim shell.sh #!/bin/bash //声明脚本解释器,这个‘#’号不是注释,其余是注释 #Program: //程序内容说明 #History: //时间和作者 二.sh ...

  9. shell脚本编程学习笔记(三)编写邮件报警脚本

    一.shell编写邮件报警脚本 1.POSTFIX邮件服务器准备 a.首先卸载服务器上自带的sendmail rpm -qa sendmail* //查看安装的sendmail rpm -e send ...

随机推荐

  1. Go Packages、Variables、functions

    [Go Packages.Variables.functions] 1.定义包名. 2.引入Package. 3.定义导出的变量.首字母必须大写. 4.函数.Notice that the type ...

  2. mount /dev/sr0 /media/cdrom you must specify the filesystem type

    发现“CD/DVD”的Device status中的“Connected”未打勾,将此项打勾后(不需要重启虚拟机),可以正常挂载光驱

  3. solr dismax与edismax的参数列表

    dismax q.alt qf (Query Fields) mm (Minimum 'Should' Match) pf (Phrase Fields) ps (Phrase Slop) qs (Q ...

  4. 表示集合的数据结构:数组(Array),对象(Object),Map和Set

    Map和Set是ES6标准新增的数据类型 Map: 是一组键值对的结构,使用一个二维数组来初始化Map,例如: var m = new Map([['xiaohong',100],['xiaolan' ...

  5. loadrunner12-用Chrome如何录制脚本

    1.下载Chrome最新版本: 2.打开需要录制的网页,按下F12按钮: 3.在弹出框中,选择Network标签,在该标签下单击红色按钮(开始录制按钮): 4.按下F5刷新页面(不管是否需要录制当前页 ...

  6. iOS界面设计,12个优秀案例激发你的灵感

    总所周知,iOS和Android是当今两大移动平台,前者采用Human Interface Design,后者采用Material Design.作为设计师,尤其是App设计师,总是会在这两者进行设计 ...

  7. tomcat运行为什么要依靠jdk

    问题1:为什么要装jdk 因为tomcat是用java写的,所以运行需要JRE,就是JAVA运行时刻环境,所以必须通过安装JDK来得到这个运行环境,不装JDK装JRE也行,sun的网站上有下载.但是J ...

  8. Linux 基础教程 40-df和du命令

    df     df用于显示文件系统的整体磁盘使用量. 基本用法 df [选项] [目录/文件] 其常用选项如下所示: 选项 说明 -a, --all 显示所有文件系统,包括/proc等虚拟文件系统 - ...

  9. dxbarmanager生成传统下拉式样的菜单

    传统菜单 //创建一个dxSubItem,相当于创建一个主菜单项 dxBarSubItem := TdxBarSubItem.Create(Self); dxBarSubItem.Caption := ...

  10. ASP.NET Core 中的应用程序启动 Startup

      ASP.NET Core 应用使用Startup类来作为启动类.   Startup类中包含了ConfigureServices方法,Configure方法,IConfiguration,IHos ...