• 第二章 bash shell 脚本介绍


     学习linux/unix 编程 shell脚本毕不少。 本文只有全面介绍,详细介绍查阅相关资料。只让读者对脚本有个简单了解。现实中也不大可能把所有记住,只要有印象出来查阅资料就行。

    (1)基本结构

      1>  shbang  脚本文件的第一行  通知内核使用那种脚本解释器  #!后面跟解释器路径名    eg:#!bin/bash 

      2>  注释     以#开始的行

      3>  通配符   包括正则表达式 * ? []   还有I/O重定向   管道 | 等,具体查阅相关知识

      4> 显示输出  echo 命令

      5> 局部变量  eg:varname=value1  myname=“wxr”   itegerNum=10  

      6> 全局变量  eg:  export varname=value1   declare -x varname=value1

      7> 提取变量    eg:echo   $varname

      8> 读取用户输入 eg: read name

      9> 命令行参数 $1 $2 $3 ...  位置参数  $* 或者$@ 所有位置参数 是个数组 $# 参数个数

      10>数组    declare -a 声明变量 下标从0 开始访问  eg:declare -a fruit=(apple pears)  echo ${fruit[0]}

      11> 命令替换   命令可以赋值给一个变量 或者单引号来引用  eg: var = 'date' 或者$(date)   echo $var

      12> 算数运算   eg:((n=5+5)) echo $n

      13> 关系运算符与逻辑运算符  同C语言

      14> 条件语句  if then  ....   fi 结构    case  结构

      15> 循环结构 while untill for selcet

      16> 函数  fuction fuctionname {}   或者 fuctionname() {}  

    (2)  条件测试test

      之所以单独讲这个命令 是因为在shell脚本中经常要使用这个命令 命令test或[ 可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status 为0 如果测 试结果为假,则命令的Exit Status 为1 (注意与C 语言的逻辑表示正好相反)

      test 有两种格式 eg : test -d Dir     [ -d dir ]

      [ -d DIR ]   如果DIR 存在并且是一个目录则为真

      [ -f FILE]   如果FILE存在且是一个普通文件则为真

      [ -z STRING ] 如果STRING 的长度为零则为真

      [ -n STRING ]  如果STRING 的长度非零则为真

      [ STRING1= STRING2 ] 如果两个字符串相同则为真

      [ STRING1!= STRING2 ] 如果字符串不相同则为真

      [ ARG1 OP ARG2 ] ARG1和ARG2应该是整数或者取值为整数的变量,OP是-eq (等于)-ne(不等于)-lt (小于)-le (小于等于)-gt (大于)-ge (大于等于)之中的一个

      [ ! EXPR ]  EXPR可以是上表中的任意一种测试条件,! 表示逻辑反

      [ EXPR1 -a EXPR2] EXPR1和EXPR2可以是上表中的任意一种测试条件,-a表示逻辑与

      [ EXPR1 -o EXPR2] EXPR1和EXPR2可以是上表中的任意一种测试条件,-o表示逻辑或

    (3)  正则表达式

      正则表达式就是字符 数量 位置的字符匹配。之所以在这里讲正则表达式 完全是因为它在shell 字符串处理中常用  。

      1>  字符类

        .  匹配任意一个字符         eg: abc.可以匹配abcd、abc9等

        [] 匹配括号中的任意一个字符     eg:[abc]d  可以匹配ad、bd或cd

        - 在[]括号内表示字符范围      eg: [0-9a-fA-F] 可以匹配一位十六进制数字

        ^位于[]括号内的开头,匹配除括号中的字符之外的任意一个字符 

      2> 数量类

        ? 紧跟在它前面的单元应匹配零次或一次  eg:[0-9]?.[0-9] 匹配0.0 、2.3 、.5等,由于. 在正则表达式中是一个特殊字符,所以需要用 转义一下

        + 紧跟在它前面的单元 应匹配一次或多次 eg:[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+.[a-zA-Z0-9_.-]+匹配email地址  

        * 紧跟在它前面的单元应匹配零次或多次 eg:[0-9][0-9]* 匹配至少一位数字,等价于[0-9]+ ,[a-zA-Z_]+[a-zA-Z_0-9]*匹配C 语言的标识符

        {N} 紧跟在它前面的单元应精确匹配N 次 eg:[1-9][0-9]{2} 匹配从100 到999 的整数

        {N,} 应匹配至少N 次[1-9][0-9]{2,}匹配三位以上(含三位)的整数

        {,M} 紧跟在它前面的单元 应匹配最多M 次 eg: [0-9]{,1}相当于[0-9]?

              {N,M}紧跟在它前面的单元应匹配至少N 次,最多M 次

      3> 位置限定类 

        ^ 匹配行首的位置  

        $ 匹配行末的位置     eg: ;$匹配位于一行结尾的;

         < 匹配单词开头的位置    eg: <th匹配... this ,但不匹配ethernet 、tenth

        > 匹配单词结尾的位置  

                匹配单词开头或结尾的位置

        B 匹配非单词开头和结尾的

    (4) 范例

     判断输入参数个数

    #!/bin/sh 
      
    # remember - An easy command-line-based memory pad. 
      
    rememberfile="$HOME/.remember"
      
    if [ $# -eq 0 ] ; then 
      echo "Enter note, end with ^D: "
     else
      echo "$@" >> $rememberfile 
    fi
     

    (5) shell 脚本调试方法

       -n   读一遍脚本 ,检查语法错误    eg:sh -n  ./test.sh

       -v  一边执行脚本 一边将执行过的脚本错误打印到标准错误流

       -x  将每条执行的命令和结果打印出来

          有三种方法

          1>  命令行参数  eg:sh -n  ./test.sh

      2>  脚本开始行 !/bin/bash -x

      3> 程序中使用set 开启 关闭  set -x  set +x

  • 相关阅读:
    逐浪CMSv8.2发布-集成Node与Vue脚手架和PowerShell支持的新一代网站管理系统
    文化赢未来-智能做字体-逐浪字体大师1.0发布
    逐浪CMS对用户注册字段正则的自由定义(注册字段必填)
    两大高招逐浪CMS中定义省地市县三级字段显示方式
    开放融合易用@门户移动开发新体验-逐浪CMS v8.0.1全面发布[基于dotNET Core]
    点触科技安全验证新模式与逐浪CMS3.9.3新功能预览
    摩拜ofo挥师三四线市场 第二梯队面临"团灭"危机
    谷歌提出新的字体调用方案帮助提高中文字体的加载速度
    [图]Windows 10 Build 16273版本更新发布:新增可变式字体Bahnschrift
    rabbitMQ面试题 整理给自己
  • 原文地址:https://www.cnblogs.com/wolfrickwang/p/3183858.html
Copyright © 2020-2023  润新知