• shell脚本学习总结(不断更新中)


    前言:自从大学毕业参加工作以来,接触的开发工作都是在服务端完成,于是接触了比较多的Linux当做开发机使用,或多或少有一些重复性的工作,于是开始琢磨学习一些shell脚本的知识,以便处理这些繁琐的事情。


    shell种类有很多bash、sh、csh、ksh等,不同的环境下使用的也不同,不过bash应该是使用最广泛了~也是Linux发行版默认的;

    主要就是掌握常见的命令以及语法格式吧~然后就可以上手干活了:

    命令如下:

    1. echo:输出命令到终端
      • -e:表示对转义字符进行替换
      • -E:禁止转义
    2. read:从终端中读入命令
    3. readonly:将命令标记为只读命令
    4. unset:删除变量,但是不能删除readonly标记的变量
    5. printf:usage: printf format-string [arguments...]  eg:printf "%s %s %s " a b c d e f g h i j

    转义字符:

    1. \:反斜杠
    2. a:警报
    3. :退格
    4. f:换页
    5. :换行
    6. :回车
    7. :tab键
    8. v:垂直制表符

    特殊变量:

    1. $0:当前脚本的文件名
    2. $n:表示传递给文件或者函数的参数,n是几就表示第几个参数
    3. $#:表示参数的个数
    4. $*:表示所有的参数
    5. $?:上个命令的退出状态或则函数的返回值
    6. $$:当前shell的进程ID
    7. $@:也是表示所有参数,和$*的区别就是:"$@"会显示所有的参数,每个一行,"$*"将所有的参数显示在一行

    命令替换:`command`

    DATE=`date`
    echo "Date is $DATE"USERS=`who | wc -l`
    echo "Logged in user are $USERS"UP=`date ; uptime`
    echo "Uptime is $UP"


    变量替换:

    1. ${var} 变量本来的值
    2. ${var:-word} 如果变量var为空或则Unset,那么返回word,但是不改变var的值
    3. ${var:=word}如果变量var为空或则unset,那么返回word,并将var的值设置为word
    4. ${var:?messgage}如果变量var为空或则unset,那么messgae将送到标准错误输出,脚本停止运行
    5. ${var:+word}如果变量var被定义,那么返回word,但不改变var的值

    运算符:

    1. 算术运算符(expr):
      1. +  加法  `expr $a + $b`
      2. -   减法  `expr $a - $b`
      3. *      乘法      `expr  $a * $b`
      4. /       除法      `expr $b / $a`
      5. %     取余       `expr $b % $a`
      6. =      赋值       a=$b 把变量b的值赋给a
      7. ==   相等,用于比较两个数字,相同则返回true    [$a == $b]
      8. !=    不相等。用于比较两个数字,不相同则返回true  [$a != $b]
      9. eg:
        #!/bin/sh
        a=10
        b=20
        val=`expr $b % $a`
        18.echo "b % a : $val"
    2. 关系运算符
      1. -eq    检测两个数是否相等,相等则返回true
      2. -ne    检测两个数是否不相等,不相等则返回true
      3. -gt    检测左边的数是否大于右边的数,如果是,则返回true
      4. -lt     检测左边的数是否小于右边的数,如果是,则返回ture
      5. -ge   检测左边的数是否大于等于右边的数,如果是,则返回true
      6. -le    检测右边的数是否小于等于右边的数,如果是,则返回true   
      7. eg:
        #!/bin/sh
        
        a=10
        b=20
        if [ $a -eq $b ]
        then
           echo "$a -eq $b : a is equal to b"
        else
           echo "$a -eq $b: a is not equal to b"
        fi
    3. 布尔运算符:
      1. !    非运算    [!false] 返回true
      2. -o    或运算    [$a -lt 20 -o $b -gt 100]
      3. -a    与运算    [$a -lt 20 -a $b -gt 100]  
    4. 字符串运算符:中括号两边要留个空隙
      1. =    检测两个字符串是否相等,相等则返回true     [ $a = $b ]返回false
      2. !=   检测两个字符串是否相等,不相等返回true     [ $a != $b ]返回true
      3. -z    检测字符串长度是否为0, 为0返回ture         [ -z $a ]
      4. -n    检测字符串长度是否不为0,不为0返回true    [ -n $a ]
      5. str   检测字符串是否为空,不为空返回true           [ $a ] 返回true  
    5. 文件测试运算符:
      1. -b file    检测是否是块设备文件    [-b $file]
      2. -c file    检测是不是字符设备文件   [-c $file]
      3. -d file   检测是不是目录     [-d $file]
      4. -f file    检测是不是普通文件(既不是目录,也不是设备文件) [-f $file]
      5. -g file   检测是否设置了SGID位
      6. -k file   检测是否设置了(sticky bit)
      7. -p file   检测是否具有管道
      8. -u file   检测是否设置了SUID位
      9. -r file    检测是否可读
      10. -w file   检测是否可写
      11. -x file   检测是否可以执行
      12. -s file   检测是否为空文件(大小为0)
      13. -e file   检测文件是否存在

    字符串操作:

    1. ${#string}    $string的长度
    2. ${string:position}  在$string中,从位置$position开始提取子串
    3. ${string:position:length}   在$string中,从位置$position开始提取长度为$length的子串
    4. ${string#substring}   从变量$string的开头,删除最短匹配$substring的子串
    5. ${string##substring}  从变量$string的开头,删除最长匹配$substring的子串
    6. ${string%substring}  从变量$string的结尾,删除最短匹配$substring的子串
    7. ${string%%substring}  从变量$string的结尾,删除最长匹配$substring的子串
    8. ${string/substring/replacement}   在$string中用$replacement取代第一个匹配的$substring
    9. ${string//substring/replacement}  在$string中用$replacement取代全部匹配的$substrng
    10. ${string/#substring/replacement} 如果$string的前缀匹配$substring,那么用$replacement取代$substring
    11. ${string/%substring/replacement} 如果$string的后缀匹配$substring,那么用$replacement取代$substring

    数组的操作:  

      定义数组:array_name=(value0 value1 value2 value3)数组的操作:
      读取数组:${array_name[2]}
      读取数组的元素的个数:${#array_name[@]}/${#array_name[*]}
      返回数组的所有的下标:${!array_name[@]}/${!array_name[*]}
      返回数组的所有的元素:${array_name[@]}/${!array_name[*]}

    注意的事项:

    1. 变量的初始化中间不能有空格,eg: name="Spider"
    2. 变量的使用时候,最好以${name}这种形式,确认变量的边界;eg: echo 'I am ${name}-spiders'
    3. 注释只能用#号
    4.  if..else使用:
      • if then... fi 语句;
      • if then... else ... fi 语句;
      • if then... elif then... else ... fi 语句。
    5. case..switch
      1.   
        echo 'Input a number between 1 to 4'
        echo 'Your number is:c'
        read aNum
        case $aNum in
            1)  echo 'You select 1'
            ;;
            2)  echo 'You select 2'
            ;;
            3)  echo 'You select 3'
            ;;
            4)  echo 'You select 4'
            ;;
            *)  echo 'You do not select a number between 1 to 4'
            ;;
        esac


         

    6. for循环:
      1.   
        for 变量 in 列表
        do
            command1
            command2
            ...
            commandN
        done
    7. while循环:
      1.   
        while command
        do
           Statement(s) to be executed if command is true
        done
    8. until循环:
      1.   
        until command
        do
           Statement(s) to be executed until command is false
        done
    9. break and continue ,和其它语言不同的是,shell中的可以后加数字n,表示第几层循环
    10. 函数:
      1. 注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数  
        function_name () {
            list of commands
            [ return value ]
        }

         command > file   输出重定向到file

      2. command < file   输入重定向到file
      3. command >> file 输出以追加的方式重定向到file
      4. n > file 将文件描述符重定向到file
      5. n >> file 将文件描述符以追加的方式重定向到file
      6. n >& m 将输出文件m和n合并
      7. n <& m 将输入文件m和n合并
      8. << tag 将开始标记tag和结束标记tag之间的内容作为输入
    11. 重定向,如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
      1. $command > file 2>&1
    12. 重定向到/dev/null 文件,屏蔽输出结果
    13. 调试shell 脚本:在#! /bin/bash -x 就可以看到脚本执行的顺序
    14. 通配符

      shell常见通配符:

      字符 含义 实例
      * 匹配 0 或多个字符 a*b  a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。
      ? 匹配任意一个字符 a?b  a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。
      [list]  匹配 list 中的任意单一字符 a[xyz]b   a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。
      [!list]  匹配 除list 中的任意单一字符 a[!0-9]b  a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。
      [c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] a[0-9]b  0与9之间必须也只能有一个字符 如a0b, a1b... a9b。
      {string1,string2,...} 匹配 sring1 或 string2 (或更多)其一字符串 a{abc,xyz,123}b    a与b之间只能是abc或xyz或123这三个字符串之一。 
  • 相关阅读:
    Setting up SharePoint Blogs, Wikis, and Announcements
    Reports 将透视表显示成没有级联关系的普通表
    TF80012: The document cannot be opened because there is a problem with the installation of the Microsoft Visual Studio v
    项目干系人分析的“四步法”
    Overload和Override的区别
    Add and Customize a Type of Work Item
    将所有的非DLL, PDB文件从一个位置Copy到另外一个位置,相同文件跳过
    如何删除工作项
    No Excel Calculation Services is available in the farm
    SPORTINGLIFE.COM
  • 原文地址:https://www.cnblogs.com/Spider-spiders/p/5872710.html
Copyright © 2020-2023  润新知