前言:自从大学毕业参加工作以来,接触的开发工作都是在服务端完成,于是接触了比较多的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\n" a b c d e f g h i j

转义字符:

  1. \\:反斜杠
  2. \a:警报
  3. \b:退格
  4. \f:换页
  5. \n:换行
  6. \r:回车
  7. \t: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=
      b=
      val=`expr $b % $a`
      .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=
      b=
      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
      ) echo 'You select 1'
      ;;
      ) echo 'You select 2'
      ;;
      ) echo 'You select 3'
      ;;
      ) 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这三个字符串之一。 

shell脚本学习总结(不断更新中)的更多相关文章

  1. 笔记——shell脚本学习指南

    <shell脚本学习指南>机械工业出版 ISBN 987-7-111-25504-8 第2章 2.4 初级陷阱 1.当今的系统,对#!这一行的长度限制从63到1024个字符都有,尽量不要超 ...

  2. Shell 脚本学习资料搜集

    Shell文档 ChinaUnix上大神“網中人”总结的Shell十三问,强烈推荐,这本书讲得比较精炼,而且都是一些Shell学习中容易把握不住的一些细节难点.每一问都写得非常精彩.ChinaUnix ...

  3. 转 shell脚本学习指南

    shell脚本学习指南 以下八点不敢说就能成为你shell脚本学习指南de全部,至少可以让你编写出可靠的shell脚本. 1. 指定bashshell 脚本的第一行,#!之后应该是什么?如果拿这个问题 ...

  4. Shell脚本学习 - 运算符

    继续shell脚本学习.上一篇是基本数据类型和语法的总结,这一篇是运算相关的操作. 运算符 bash不支持简单的数学计算,需要依赖其他命令实现. expr可以代为实现. # 表达式一般这么写 ` + ...

  5. shell脚本学习总结02--数组

    bash同时支持普通数组个关联数组,普通数组只能使用整数作为数组的索引,关联数组可以使用字符串作为数组的索引. 数组的定义方法: 在单行中使用一列值定义一个数组 [root@new ~]# array ...

  6. Shell脚本学习指南笔记

    Shell脚本学习指南 作者:Danbo 2015-8-3 脚本编程语言与编译型语言的差异 许多中型.大型的程序都是用编译型语言写的,例如:C.C+.Java等.这类程序只要从源代码(Source C ...

  7. shell脚本学习之6小时搞定(1)

    shell脚本学习之6小时搞定(1) 简介 Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本. Unix/Linux上常见的Shell脚本解释器有bash.sh.csh.ksh等,习惯上把 ...

  8. 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式

    正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...

  9. shell脚本实现读取一个文件中的某一列,并进行循环处理

    shell脚本实现读取一个文件中的某一列,并进行循环处理 1) for循环 #!bin/bash if [ ! -f "userlist.txt" ]; then echo &qu ...

随机推荐

  1. Antd Select组件结合使用出现must set key for <rc-animate> children问题

    一.以下情况可能导致错误发生 出现这个问题的首要条件是因为Select的mode 设置成multiple or tags 1. Select的defaultValue使用了空字符串 例如: const ...

  2. 虚拟现实外包—动点飞扬软件专门承接VR/AR场景、游戏、项目外包

    VR外包AR外包公司(虚拟现实外包公司)承接虚拟现实项目开发(企业.教育.游戏.企业大数据展示等) 有VR/AR.Unity3D项目.游戏外包业务欢迎 联系我们 QQ:372900288 TEL:13 ...

  3. DAY 17常用模块

    一.时间模块:time 1.时间戳:time.time() # 可以作为数据的唯一标识 print(time.time) # 1554878849.8452318 2.延迟线程的运行:time.sle ...

  4. jmeter的安装和配置

    jmeter环境配置 Java 8 安装 正常安装,一路默认就好,记住安装路径,配置环境变量时用得到.默认安装路径:C:\Program Files\Java\jdk1.8.0_91. 安装好之后会有 ...

  5. AEM上的一个图片转换工具

    目的: 不同情况下,同样一张图片,需要不一样大小/背景/尺寸显示. 例子: dam下面有一张940 x 300 的图片: http://localhost:4502/content/dam/geome ...

  6. JS中for循环变量作用域

    http://www.cnblogs.com/zhus/p/6513741.html  博主写得很好

  7. [GXOI/GZOI2019]与或和

    考虑拆位,计算每一个二进制位的贡献. 问题转化为求一个01矩阵的全0/1的子矩形个数. 考虑计算以第i行第j列为右下角的合法子矩形个数. 发现合法的左上角范围向左是单调下降的. 可以用一个单调栈来维护 ...

  8. GET 和 POST 的区别 以及为什么 GET请求 比 POST请求 更快

    引子: 和朋友的聊天中得知他公司后台接口全部都是 POST 请求, 我表示很纳闷为什么全是 POST 请求呢? GET 比 POST 安全,或者说 便于后台方便,后台不用区分包装类  (所以全部用 P ...

  9. 【算法】祭奠spfa 最短路算法dijspfa

    题目链接 本题解来源 其他链接 卡spfa的数据组 题解堆优化的dijkstra 题解spfa讲解 来自以上题解的图片来自常暗踏阴 使用前向星链表存图 直接用队列优化spfa struct cmp { ...

  10. net.js

    var http = require('http'); var https = require('https'); var url=require("url"); var pass ...