• 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.
  • 相关阅读:
    elementui组件库eldialog弹出框被遮罩层挡住
    python常规基础操作
    python中的字典排序
    python列表面试题
    python logging日志模块
    python序列之列表
    jmeter中csv连接数据库
    python必会的知识基础
    jmeter tcp 压力测试
    python模块基础知识练习
  • 原文地址:https://www.cnblogs.com/hqutcy/p/8819409.html
Copyright © 2020-2023  润新知