Unix Shell脚本编程知识点总结及范例

脚本编程语言与编译型语言:

  
  
  
  
  1. 脚本编程语言:(Bash)  

  2.    脚本编程语言通常是解释型(interpreted),主要由解释器(interpreter)读入程序代码,并将其转换成内部的形式加以执行。  

  3.    优点:  

  4.        能够轻易处理文件与目录之类的对象。  

  5.    缺点:  

  6.        运行效率通常不如编译型语言  

  7. 编译型语言:(C、C++、Java、Fortran、Ada、Pascal)  

  8.    编译型语言多半运作于底层,所处理的是字节、整数、浮点数或其它及其机器层经的对象。

SHELL脚本的基本语法格式:

  
  
  
  
  1. 脚本必须以#!开头:(# cat /etc/shells)  

  2. 例如#!/bin/bash(解释器)  

  3. # 其中间可以添加一些注释信息,例如脚本的使用方法、脚本的功能、创建日期、作者等相关信息  

  4. 然后赋予脚本具有执行权限,# chmod +x scripts.sh  

  5. 执行则使用./scripts.sh ##也可以将此脚本的路径添加到PATH变量中,以后直接使用脚本名称直接运行。  

  6. 脚本的测试工具bash:  

  7. -n:检查脚本是否有语法错误,有则显示错误信息,否则无信息(没有消息才是最好的消息)  

  8. -x:检查脚本在执行中的详细过程(排错时,经常会用到)  

  9. exit:退出脚本(其数值为0-255)  

  10. 如果脚本没有明确定义退出码,那么在执行脚本结束前的退出码为此脚本的退出码。  

  11. # echo $?     ##查看上一个命令执行结果所显示的状态码

SHELL脚本的逻辑关系总结:

  
  
  
  
  1. 逻辑与:符号为&&:

  2. 如果其中一个为假,则结果一定为假  

  3. 如果第一个条件结果为假,则第二个条件不用再判断,最终结果已显示  

  4. 如果第一个条件结果为真,则第二个条件必须判断

  5. 范例:

  6. # useradd redhat && echo "redhat" | passwd --stdin redhat
    解说:如果useradd redhat执行成功,则继续执行下一条命令,否则终止。

  
  
  
  
  1. 逻辑或||:

  2. 如果其中一个条件结果为真,则结果一定为真,不用检查后面的语句  

  3. 如果其中一个条件结果为假,则检查下一个条件语句  

  4. 范例:

  5. # id redhat || useradd redhat  

  6. 解说:如果redhat用户存在,就显示redhat用户相关信息,否则添加此账户。  

  7. 逻辑与和逻辑或联合使用范例:  

  8. # id redhat && echo “redhat already existing“ || useradd redhat  

  9. 解说:如果redhat用户存在,则显示redhat用户已存在,否则添加此账户。

条件判断语句总结:

  
  
  
  
  1. 单分支if语句双分支if语句     多分支if语句case选择语句  

  2. if 判断条件 ;then    if 判断条件;then     if 判断条件;thencase $1 in

  3.   statement           statement          statement                  string)  

  4.   ......              ........           .........                      statement;;  

  5. fi                  else               elif 判断条件;then             string2)  

  6.                       statement          statement                      statement;;  

  7.                       .....              .........                  ......)  

  8.                    fi                 elif 判断条件;then                 statement;;  

  9.                                                 statement           esac  

  10.                                                 .........  

  11. else

  12.                                                 statement  

  13.                                              fi

范例:

  
  
  
  
  1. 脚本分析:  

  2. 主要功能:传递一个不同的参数,来完成用户的创建、添加密码、删除用户。  

  3. 详细说明:  

  4. 当我们传递--add参数给此脚本时,此脚本为完成指定用户的添加,如果添加的用户存在,则提示用户以存在,否则添加指定用户并创建以用户为自身的密码;

  5. 当我们传递--del参数给此脚本时,此脚本会删除我们指定的用户,如果存在则删除此用户,否则提示用户不存在。

  6. 当我们传递--help参数给此脚本时,此脚本会给我们现实脚本的使用方法。

  7. 当我们传递其它参数时,会提示无法识别的选项。


POSIX的结束状态总结:

  
  
  
  
  1. 0:      ##命令成功所显示的状态  

  2. >0:     ##在重定向或单词展开期间(~、变量、命令、算术展开及单词切割)失败  

  3. 1-125   ##命令不成功所显示的状态。  

  4. 126     ##命令找到了,但文件无法执行所显示的状态  

  5. 127     ##命令找不到,所显示的状态  

  6. >128    ##命令因收到信号而死亡

替换运算符总结(变量的赋值):

  
  
  
  
  1. ${varname:-word}  

  2.    如果varname存在且非null,则返回其值;否则,返回word;  

  3.    用途:如果变量未定义,则返回默认值  

  4.    范例:如果count未定义,则${count:-0}的值为0  

  5. ${varname:=word}  

  6.    如果varname存在且非null,则返回其值;否则,将varname设置为word,并返回其值;  

  7.    用途:如果变量未定义,则设置变量为默认值  

  8.    范烈:如果count未定义,则${count:=0}的值为0  

  9. ${varname:+word}  

  10.    如果varname存在且非null,则返回word;否则,返回null;  

  11.    用途:为测试变量的存在  

  12.    范例:如果count已定义,则${count:+1}的值为1  

  13. ${varname:?message}  

  14.    如果varname存在且非null,则返回其值;否则显示varname:message,并退出当前命令或脚本;  

  15.    用途:为了捕捉由于变量未定义所导致的错误。  

  16.    范例:如果count未定义,${count:?"undefined!"}则显示count:undefined!

模式匹配运算符总结:

  
  
  
  
  1. 假设path变量的值为:/etc/sysconfig/network-scripts/ifcfg-eth0.text.bak  

  2. ${variable#pattern}:  

  3.    如果模式匹配于变量值的开头处,则删除匹配的最短部分,并返回剩下的部分;  

  4.    范例:echo ${path#/*/}的值为etc/sysconfig/network-scripts/ifcfg-eth0.text.bak  

  5. ${variable##pattern}  

  6.    如果模式匹配于变量值的开头处,则删除匹配的最长部分,并返回剩下的部分;  

  7.    范例:echo ${path##/*/}的值为ifcfg-eth0.text.bake  

  8. ${variable%pattern}  

  9.    如果模式匹配于变量的结尾处,则删除匹配的最短部分,并返回剩下的部分;  

  10.    范例:echo ${path%.*}的值为/etc/sysconfig/network-scripts/ifcfg-eth0.text  

  11. ${variable%%pattern}  

  12.    如果模式匹配于变量的结尾处,则删除匹配的最长部分,则返回剩余部分。  

  13.    范例:echo ${path%%.*}的值为/etc/sysconfig/network-scripts/ifcfg-eth0  

  14. ${#variable}  

  15.    显示variable变量值的字符长度

Shell脚本常用的循环语句总结:

  
  
  
  
  1. for循环                       while循环                 until循环  

  2. for 变量 in 列表 ;do    while condition(条件);do      until condition ;do  

  3.    command...              statements                      statements  

  4. done                    done                            done  


  5. while循环:只要condition满足条件,while会循环  

  6. until循环:只要condition不满足条件,until会循环

test命令

  
  
  
  
  1. test命令可以处理shell脚本中的各类工作,它产生的不是一般输出,而是可使用退出状态,test接受各种不同的参数,可控制它要执行哪一种测试  

  2. 语法:  

  3.    test [ expression ]  

  4.    test [ [expression] ]  

  5. 用途:  

  6.    为了测试shell脚本里的条件,通过退出状态返回其结果。  

  7. 行为模式:  

  8.    test用来测试文件的属性、比较字符串、比较数字  

  9. 主要选项与表达式:  

  10. string      string不是null

  11. -b file     file是块设备文件(-b)  

  12. -c file     file是字符设备文件(-c)  

  13. -d file     file为目录(-d)  

  14. -e file     file是否存在  

  15. -f file     file是一般文件(-)  

  16. -g file     file有设置它的setgid位  

  17. -h file     file是一个符号链接  

  18. -r file     file是可读的  

  19. -s file     file是socket  

  20. -w file     file是可写的  

  21. -x file     file是可执行的,或file是可被查找的目录  

  22. s1 = s2     s1与s2字符串相同  

  23. s1 != s2    s1与s2字符串不相同  

  24. n1 -eq n2   整数n1与n2相等  

  25. n1 -ne n2   整数n1与n2不相等  

  26. n1 -lt n2   整数n1小于n2  

  27. n1 -gt n2   整数n1大于n2  

  28. n1 -le n2   整数n1小于或等于n2  

  29. n1 -ge n2   整数n1大于或等于n2  

  30. -n string   string是非null

  31. -z string   string为null特殊参数变量

  32. 在bash shell中有些特殊变量,它们会记录命令行参数的个数。例如$#

  33. 你可以只数一下命令行中输入了多少个参数,而不同测试每个参数。bash为此提供了一个特殊的变量,就是上面所提到的$#

  34. $#的说明

    1. $#特殊变量含有脚本运行时就有的命令行参数的个数。你可以在脚本中任何地方来调用这个特殊变量来调用$#来计算参数的个数

  35. 范例:

    1. vim Count.sh

      #!/bin/bash

      #Script Name: Count.sh

      # Count Parameters number


      echo There were $# parameters.


      chmod +x Count.sh

      ./Count.sh 1 2 3

      There were 3 parameters.


下面来说下${!#}的作用?

既然$#变量含有参数的总数量,那么${!#}可以调用最后一个参数的变量名称。

范例:

vim Count-1.sh

#!/bin/bash

#Script Name: Count-1.sh

# Print last parameter

params=$#

echo "The last parameter is "$params"

echo "The last parameter is "${!#}"

:wq


chmod +x Count-1.sh

./Count-1.sh  1 2 3

The last parameter is 3

The last parameter is 3








你可能感兴趣的:(for循环,shell脚本编程,while循环,if测试语句,until循环)