第二章 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

原文地址:https://www.cnblogs.com/wolfrickwang/p/3183858.html