• Shell脚本攻略之小试牛刀2


    1.调试脚本:

    (1)选择-x,启用shell脚本的跟踪调试功能:sudo sh -x TestSleep.sh

    (2)使用set -x和set +x,对脚本进行部分调试:

    #!/bin/bash
    
    for i in {1..6};
    do
     set -x    #在执行时显示参数和命令
     echo $i
     set +x    #禁止调试
    done
    
    echo "脚本执行完毕"
    #set -v:当命令进行读取时显示输入
    #set +v:禁止打印输入

    运行结果:

    (3)自定义格式显示调试信息:

    #!/bin/bash
    
    function DEBUG()
    {
       [ "$_DEBUG" == "on" ] && $@ || :
    }
    for i in {1..10}
    do
      DEBUG echo $i
    done

    运行结果:

    (4)shebang的妙用:#!/bin/bash -xv  这样可以直接启动调试功能

    2.函数和参数:

    (1)Fork炸弹函数:递归函数(可以调用自身的函数),不断生成新的进程,最终造成拒绝服务攻击

    #!/bin/bash

    :(){ :|:&};:

     

    3.将命令序列的输出读入变量:一个命令的输出可以作为另一个命令的输入,而这个命令的输出又会传递至另一个命令

     ls | cat -n > out.txt  //ls的输出(当前目录内容的列表)被传给cat -n  ,后者将通过stdin所接收到输入内容加上行号,然后将输出重定向到文件out.txt

    4.子Shell:读取由管道相连的命令序列的输出,子Shell本身就是独立的进程,可以使用 () 操作符来定义一个子Shell

    cmd_output=$(ls | cat -n)
    echo $cmd_output 

    pwd
    (cd /bin; ls)
    pwd

     

    5.反标记:存储命令输出

    cmd_output=`ls | cat -n`
    echo $cmd_output

    6.不使用回车符来读取n个字符:

    #!/bin/bash
    
    #从输入中读取2个字符并存入变量中
    read -n 2 var
    echo $var
    
    #用无回显的方式读取密码
    read -s var
    
    #显示提示信息
    read -p "Enter input:" var
    
    #在限定的2秒内键入的字符串读入变量var
    read -t 2 var
    
    #用特定的定界符作为输入行的结束
    read -d ":" var

     

    7.运行命令直至执行成功:

    #!/bin/bash
    
    repeat()
    {
      while true
      do
       $@ && return
      done
    }
    
    repeat wget -c https://plugins.jetbrains.com/pluginManager/?action=download&id=org.jetbrains.plugins.textmate&build=PC-181.4445.76&uuid=bf9acdd8-e62c-4dcf-8d5e-ec210f5c8c2c        //调用repeat函数,循环执行下载任务

    创建了一个函数repeat,它包含一个无限while循环,该循环执行以参数形式(通过$@访问)传入函数的命令,如果命令执行成功,则返回,进而退出循环

    repeat() { while :; do $@  &&  return ;done }

    或者

    repeat() { while :; do $@  &&  return ;sleep 30;done }

    8.字段分隔符和迭代器:内部字段分隔符(IFS)是Shell脚本编程中的一个重要概念

    #!/bin/bash
    
    data="name,sex,rollno,location"
    
    #IFS的默认值为空白字符(换行符,制表符或空格)
    oldIFS=$IFS
    #IFS被设置为逗号时,shell将被视为一个定界符,因此变量$item在每次迭代中读取由逗号分隔的字>串作为变量值
    
    IFS=,
    
    for item in $data;
    do
      echo Item:$item
    done
    
    IFS=$oldIFS

    实例:

    #!/bin/bash
    IFS=":"
    count=0
    
    for item in $line;
    do
     [ $count -eq 0 ] && user=$item;
     [ $count -eq 6 ] && shell=$item;
     let count++
    done
    
    IFS=$oldIFS
    
    echo $user's shell is $shell

    9.比较与测试:

    (1)逻辑运算符:

    [ condition ] && action ;              //如果condition为真,则执行action,逻辑与运算符   &&   -a

    [ conditon ] ||  action;                   //如果condition为假,则执行action,逻辑或运算符  ||   -o

    (2)字符串比较:使用字符串比较时,最好用双中括号,因为有时候采用单个中括号会产生错误,所以最好避开他们

    #!/bin/bash
    
    #[[ $str1 = $str2 ]]:当str1等于str2时。返回真,也就是说str1与str2包含的文本是一模一样的
    
    #[[ $str1 != $str2 ]]:当str1与str2不相等时,返回真
    
    #我们还可以检查字符串的字母序情况
    
    #[[ $str1 > $str2 ]]:当str1的字母序比str2大时,返回真
    
    #[[ $str1 < $str2 ]]:当str1的字母序比str2小时,返回真
    
    #[[ -z $str1 ]]  :如果str1包含的是空字符串,则返回真
    
    #[[ -n $str1 ]]  :如果str1包含的是非空字符串,则返回真
    
    str1="Not empty "
    
    str2=""
    if [[ -n $str1 ]] && [[ -z $str2 ]]
    then
     echo str1 is nonempty  and str2 is empty string.
  • 相关阅读:
    第一次实习项目总结
    javascript整理笔记(一)-----写项目的小技巧
    Vue(项目踩坑)_These dependencies were not found: * !!vue-style-loader!css-loader?{"sourceMap":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{"vue"
    JS(递归-记一次面试题)-写一个get函数,get({a:1}, 'a')输出1,get({a : {b:2}},‘a.b’)输出2,按照此规律写一个函数
    html5_音视频的兼容性写法
    canvas_画出图片的马赛克
    项目(踩坑)_移动端在使用touch滑动事件的时候会出现抖动现象
    vue+mongoose+node.js项目总结第七篇_express框架中使用socket.io插件实现在线聊天功能(前端消息发送-后端接收逻辑)
    网址
    RAII Theory && auto_ptr
  • 原文地址:https://www.cnblogs.com/hqutcy/p/8819409.html
Copyright © 2020-2023  润新知