设为首页 收藏本站
查看: 728|回复: 0

Linux学习笔记<八>——shell编程

[复制链接]

尚未签到

发表于 2018-8-29 08:32:48 | 显示全部楼层 |阅读模式
  编译器、解释器:将高级语言转换成机器语言
  编译语言:机器语言、汇编语言和高级语言
  静态语言:编译型语言
  强类型:变量在使用前,必须事先生命,甚至还需要初始化
  事先编译,事先转换成可执行格式
  C、C++、JAVA、C#
  动态语言:解释型语言,on the fly
  弱类型:变量用时声明,甚至不区分类型
  边解释边执行
  PHP、shell、python、perl
  面向过程:shell、C
  面向对象:JAVA、python、perl、C++
  脚本:命令的堆砌,按实际需求,结合命令流程控制机制源程序
  shebang:魔数
  #!/bin/bash:指定使用哪个shell来执行脚本
  #:注释行,不执行
  脚本在执行时会启动一个子shell进程;
  命令行中启动的脚本会继承当前shell环境变量;
  系统自动执行的脚本(非命令行启动)就要自我定义需要用到的各环境变量
  面向过程
  控制结构
  顺序结构
  选择结构
  循环结构
  选择结构:
  1.if条件语句
  if [ expression ] ;then
  statement1
  ...
  elif 条件 ;then
  statement1
  ...
  ...
  fi
  expression中的整数比较
  -eq:测试两个整数是否相等,比如 $A -eq $B
  -ne:not equal
  -gt:greater than
  -lt:less than
  -ge:great than or equal
  -le:less than or equal
  expression中的文件测试
  -e FILE:测试文件是否存在
  -f FILE:测试文件是否为普通文件
  -b FILE:测试文件是否为块设备文件
  -c FILE:测试文件是否为字符设备文件
  -d FILE:测试指定路径是否为目录
  -r FILE:测试当前用户对指定文件是否有读取权限
  -w FILE:                   写
  -x FILE:                   执行
  expression中的字符或字符串测试
  ==:测试是否相等,相等为真,不等为假
  !=:测试是否不等,不等为真,等为假
  -n string:测试指定字符串是否为空,非空为真,空为假
  -z string:测试指定字符串是否不空,空为真,非空为假
  expression中的逻辑组合测试
  -a:与关系,两边为真才算真  [ exp1 ] && [ exp2 ]
  -o:或关系,两边为假才算假  [ exp1 ] || [ exp2 ]
  !:非关系
  例子:if [ $# -gt 1 -a $# -le 3 ]    if [ $# -gt 1 ] && [$# -le 3 ]
  if COMMAND ;then
  statement1
  ...
  else
  statement2
  ...
  fi
  表示判断COMMAND的执行状态返回代码,正确执行为0,表示满足条件,执行COMMAND命令,错误执行为1-255,表示不满足条件。
  2.case语句
  case SWITCH in
  value1)
  statement
  ...
  ;;
  valule2)
  statement
  ...
  ;;
  *)
  statement
  ...
  ;;
  esac
  SWITCH中通常是变量的引用
  value中的值可以接受 a-z A-Z 0-9 [abc] -v|--verbose等格式
  循环结构:
  1.for循环语句
  for 变量 in 列表;do
  循环体
  done
  如何生成列表:
  {1..100}
  `seq 起始数 步进长度 结束数 `
  for ((变量=初始值;判断条件;变量变化));do
  statement1
  ...
  done
  2.while循环语句:满足条件后执行内部循环语句
  while CONDITION;do
  statement1
  ...
  done
  while :;do    无限循环
  statement1
  ...
  done
  while read LINE;do   逐行读取到LINE中
  statement1
  ...
  done < /path/to/file
  3.until循环语句:不满足条件后才执行内部循环语句
  until CONDITION;do
  statement1
  ...
  done
  function: 结构化编程,不能独立运行,需要调用时执行,可以被多次调用
  定义一个函数:
  function FUNCNAME {
  command
  }
  FUNCNAME() {
  command
  }
  函数中自定义执行状态返回值:
  return # (0-255)
  声明变量的属性
  declare:如果不跟参数,相当于set
  -i:声明为整数
  -a:声明为数组
  -x:相当于export,定义环境变量
  shell中的算术运算
  A=3
  B=6
  1.let 算术运算表达式
  let C=$A+$B
  2.$[算术表达式]
  C=$[$A+$B]
  3.$((算术表达式))
  C=$(($A+$B))
  4.expr 算术表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
  C=^expr $A + $B`
  命令间的逻辑关系:
  逻辑与:&&
  第一个条件为假时,第二个条件不用在判断
  第一个条件为真时,第二个条件必须判断
  逻辑或:||
  第一个条件为真时,第二个条件不用判断
  第一个条件为假时,第二个条件必须判断
  例子:[ `wc -l /etc/inittab | cut -d' ' -f1` -gt 100 ] && echo "Large file."
  定义脚本执行状态返回码
  exit:退出脚本
  exit #:定义脚本执行状态返回码为#
  如果脚本没有明确定义执行状态返回码,那么最后执行的一条命令的执行状态返回码即为脚本的执行状态返回码
  从键盘读入,给变量赋值
  read [OPTION] 变量
  -n:不换行显示
  -p "string":显示string的提示信息
  -t #:设置超时时间
  例子:read -p "请输入用户名:" USERNAME
  测试脚本是否有语法错误
  bash -n 脚本
  bash -x 脚本:单步执行
  #和%的特殊用法
  ${parameter#*word}:从左往右,取第一个word右边的字符
  ${parameter##*word}:从左往右,取最后一个word右边的字符
  ${parameter%word*}:从右往左,取第一个word左边的字符
  ${parameter%%word*}:从右往左,取最后一个word左边的字符
  例子:
  FILE=/usr/local/src
  ${FILE#*/}: usr/local/src
  ${FILE##*/}: src
  ${FILE%/*}: /usr/local
  ${FILE%%/*}:
  ${#VARNAME}:取变量中字符的长度
  局部变量
  local VAR_NAME=
  a=1
  test() {
  a=$[3+4]
  }
  test
  for I in `seq $a 10`; do
  echo $I
  done
  结果是 7 8 9 10
  a=1
  test() {
  local a=$[3+4]
  }
  test
  for I in `seq $a 10`; do
  echo $I
  done
  结果是 1 2 3 4 5 6 7 8 9 10
  信号
  kill -SIGNAL PID
  1:HUP
  2:INT
  9:KILL
  15:TERM
  脚本中能实现信号捕捉,但9和15无法捕捉
  Ctrl+c相当于发送SIGINT信号
  trap命令:bash的内建命令,捕捉信号并执行COMMAND
  trap 'COMMAND' 信号列表(信号间用空格隔开):捕捉到信号列表中的信号,就执行COMMAND命令
  例子:trap 'echo ”no quit..."' INT
  trap应用举例
#!/bin/bash  
#
  
CLEANUP(){
  rm -rf /var/tmp/test
  echo "rm success..."
  
}
  
trap 'CLEANUP;exit 5' INT
  
#trap 'rm -rf /var/test;echo "rm success...";exit 5' INT
  
mkdir -p /var/tmp/test
  
while true;do
  touch /var/tmp/test/file-`date +%F-%H-%M-%S`
  getopts:获取bash脚本中的选项和参数
  格式:getopts optstrings 变量
getopts ":b:d:" OPT  
echo $OPT     #打印选项,通常只打印第一个选项
  
echo $OPTARG  #打印选项参数
  getopts中的特殊变量
  OPTARG  #选项参数
  OPTIND  #选项指针,为整数值,值等于所选定选项的位置+1
  getopts应用举例
while getopts ":b:d:" SWITCH;do  
  case $SWITCH in
  
    b) echo "The option is b"
  echo $OPTARG;;
  d) echo "The option is d"
  echo $OPTARG;;
  *) echo "Wrong option";;
  
  esac
  
done
  
shift $[$OPTIND-1]    #shift偏移,使得脚本中的$1为选项后的第一个独立参数
  特殊符号的应用
  $#表示传给脚本的参数个数
  $0表示脚本本身的名字
  $1表示传递给该shell脚本的第一个参数
  $2表示传递给该shell脚本的第二个参数
  $@表示传给脚本的所有参数的列表
  $*表示以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
  $$表示脚本运行的当前进程ID号
  $?表示显示最后命令的退出状态,0表示没有错误,其他表示有错误
  bash中数组的应用
  声明一个数组
  declare -a array_name
  数组赋值方法
  array_name[#]=value  指定单个下标进行赋值
  array_name=(value1 value2 value3...)  依次从下标0开始赋值
  array_name=([0]=value1 [2]=value2 [5]=value3...)  指定多个下标进行赋值
  打印方法
  echo ${array_name[#]}
  例子:INDEX=$[$RANDOM%7];echo ${aa[$INDEX]}
  元素字符的长度
  echo ${#array_name} 第0个元素的字符个数
  echo ${#array_name[#]} 第#个元素的字符个数
  echo ${#array_name
  • } 整个数组中值不为空的元素的个数
      echo ${#array_name[@]} 整个数组中值不为空的元素的个数
      数组应用举例
      创建10个随机数存入数组,并找出数组中的最大数
    #!/bin/bash  
    #
      
    for I in {0..9};do
      ARRAY[$I]=$RANDOM
      echo -n "${ARRAY[$I]}"
      sleep 1
      
    done
      
    echo
      
    declare -i MAX=${ARRAY[0]}
      
    for I in `seq 1 ${#ARRAY
  • }`; do
      if [ $MAX -lt $ARRAY[$I] ];then
      MAX=${ARRAY}
      fi
      
    done
      
    echo $MAX
      生成一个数组,要求如下
      1.数组的元素个数为1-39
      2.数组元素不能相同
      3.显示此数组各元素的值
    #!/bin/bash  
    #
      
    read -p "The element numbers:" ElENUM
      

      
    function COMELE {
      for J in `seq 0 $[${#ARRAY[@]}-1]`;do
      if [ $1 -eq ${ARRAY[$J]} ];then
      return 1
      fi
      done
      return 0
      
    }
      
    ARRAY[0]=$RANDOM
      
    for I in `seq 1 $[$ELENUM-1]`;do
      
      while true;do
      ELEMENT=$RANDOM
      COMELE $ELEMENT
      if [ $? -eq 0];then
      break
      fi
      
      done
      
      ARRAY[$I]=$ELEMENT
      
    done



  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-557942-1-1.html 上篇帖子: shell变量中单引号,双引号,反引号使用 下篇帖子: 一些shell简单脚本
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表