A chain no stronger than its weakest link.

  "一着不慎,满盘皆输"

参考资料鸟哥的Linux私房菜 基础学习篇(第三版)

       Linux Shell脚本攻略

         Linux程序设计(第四版)

一、什么是shell script

  1、什么是shell script

    简单来说,shell script(程序化脚本)是利用shell功能所写的一个“程序”,它拥有自己的语法特性

  2、为什么要学shell script

    对于一个初学者来说,我觉得就那么几个原因:

      ①连续命令单一化;

      ②简单的数据处理;

      ③简化常规的系统管理;

  3、注意事项(重要!重要!重要!--重要的事情说三遍)

    ①命令的执行顺序是从上而下,从左而右地分析与执行;

    ②如果读取到一个Enter符号(CR),就尝试开始执行该行(串)命令;

    ③如果命令太长,可以使用\[Enter]来扩展至下一行;

    ④“#”可作为批注(注释),任何加在“#”后面的数据在执行时全部被忽略;

    ⑤命令、参数间的空白(包括Tab键)在执行时都会被忽略;

  4、shell script的文件结构(重要!重要!重要!)

    ①第一行为#!/bin/bash,目的是声明这个script使用的shell名称;

    ②程序内容说明;

    ③主要环境变量和函数的声明;

    ④主程序部分;

    ⑤程序的执行结果;

  5、养成良好的shell script编程习惯(重要!重要!重要!)

    ①功能(批注);

    ②版本信息(批注);

    ③作者和联系方式(批注);

    ④版权声明(批注);

    ⑤历史记录(批注);

    ⑥特殊命令应该用绝对路径的方式来执行;

    ⑦预先声明环境变量;

二、简单的shell script练习

  1、几种常用的范例

    ①交互式脚本:用 read 命令获取用户输入作为变量内容;

    ②随日期变化的文件:利用date命令的执行结果作为文件名的一部分;

    ③简单的数值运算:shell script支持 +、-、*、/、%等运算符上的整数运算;

    ④数值运算的方法:假设a=1,b=2,现在要求a+b并赋值给c,那么可以这样: let c=a+b、c=$((a+b))或者c=$[ a + b ] ;

  2、script的执行方式区别

    ①直接执行或者使用  bash name.sh  方式执行:子进程执行完之后,子进程内各项变量或操作将会结束而不传回到父进程中;

    ②利用  source name.sh  或者  . name.sh  的方式来执行:在父进程中执行;

三、测试语句

  1、利用 test 测试,命令格式: test test_expr

  2、利用  [] ,命令格式: [ test_expr ]  ,使用中括号需要注意以下几点:

    ①在中括号[]内的每个组件都要用空格键来分隔;

    ②在中括号内的变量,最好都以双引号括起来;

    ③在中括号内的常量,最好都以单或双引号括起来;

  3、关于  test_expr  ,见下表

 测试标志 代表意义 
  文件类型判断,如: test -d filename 表示 判断filename是否存在且是一个目录
-e  文件名是否存在 
-f  文件名是否存在且为文件(file) 
-d  文件名是否存在且为目录(directory) 
-b  文件名是否存在且为一个block device设备 
-c  文件名是否存在且为一个character device设备 
-S  文件名是否存在且为一个Socket文件 
-p  文件名是否存在且为一个FIFO(pipe)文件 
-L  文件名是否存在且为一个连接文件 
  文件权限检测,如: test -r filename 表示 判断filename是否可读(root权限例外)
-r  文件名是否存在且具有“可读”权限 
-w  文件名是否存在且具有“可写”权限 
-x  文件名是否存在且具有“可执行”权限 
-u  文件名是否存在且具有“SUID”属性 
-g  文件名是否存在且具有“SGID”属性 
-k  文件名是否存在且具有“Sticky bit”属性 
-s  文件名是否存在且为“非空白文件” 
  两个文件之间的比较,如: test file1 -nt file2 表示 判断file1是否比file2新
-nt  (newer than)更新 
-ot  (older than)更旧 
-ef 是否为同一文件,主要用于判定两个文件是否指向同一个inode 
整数比较,如: [ n1 -eq n2 ] 表示判断n1是否等于n2
-eq  (equal)相等
-ne  (not equal)不相等 
-gt  (greater than)大于 
-lt  (less than)小于 
-ge  (greater than or equal)大于等于 
-le  (less than or equal)小于等于 
 字符串比较
-z string  是否为空串 
-n string  是否不是空串,-n 可省略 
str1 == str2  是否相等 
str1 != str2  是否不等 
 复合判定,如:[ n -ge '0' -a n -le '9' ] 表示 判断n是否大于等于0且小于等于9 
-a   与 运算符,都成立才成立
-o  或 运算符,一个成立就成立 
非 运算符,取反 

  4、shell script的默认变量

 $: 脚本文件名;$,$,...,$i,第i个参数;
$#: 参数个数;$@:代表“ "$1"、"$2"、"$3"、...”,每个变量是独立的;$*:代表“ "$1c$2$3c..." ”,c为分隔符,默认为空格;
shift: 参数变量号码偏移,shift n 表示将所有变量的变量号码左移n位,变量计数始终从$1开始;

四、条件判断式

  1、if ... then

 if [ expr1 ]; then
  dosomething
elif [ expr2 ]; then
  dosomething
...
else
  dosomething
fi

  注意:条件表达式可以用  && 、||  连接起来进行复合判断,作用与  -a、-o  一样

  2、case ... esac

 case $变量名 in
"var1")
   dosomething
   ;;
"var2")
   dosomething
   ;;
...
*)
  dosomething
   ;;
esac

  3、使用函数(function)

 function fname()
{
  dosomething
}

   注意:函数的内置变量与shell script的默认变量类似

五、循环

  1、while do done

 while [ condition ]
do
  dosomething
done

  2、until do done

 until [ condition ]
do
  dosomething
done

  3、for...do...done

 for var in con1 con2 ...
do
  dosomething
done
for ((初始值;限制值;执行步长))   --用于数值处理
do
  dosomething
done

  补充:使用  seq a b  可以生成a到b的连续序列(整数)

六、shell script的追踪与调试

 用法:bash [-nvx] script.sh
参数:
-n  :不要执行,仅查询语法问题
-v  :在执行前,先将script的内容输出到屏幕上
-x  :将使用到的script内容显示到屏幕上,最常用的参数

七、几个重要的命令(补充,持续更新...)

  1、trap:信号处理

 用法:trap cmd signal    #在接收到signal信号后执行cmd命令
范例:trap rm tmpfile INT #接收到INT信号(Ctrl+C组合键引发)后删除tmpfile

  2、find:查找文件

 用法:find [path] [options] [tests] [actions]
功能:在 path 指定的目录下查找满足 options 和 tests 指定条件的文件,并执行 actions 指定的动作
    options说明:
    -depth          #在查看目录本身之前先搜索目录的内容
    -follow         #跟随符号链接
    -maxdepth N      #最多搜索N层目录
    -mount(或 -xdev)    #不搜索其他文件系统中的目录     tests说明:
    -atime N        #文件在N天之前被最后访问过
    -mtime N        #文件在N天之前被最后修改过
    -name pattern     #文件名(不包括路径名)匹配提供的模式pattern,pattern必须用引号括起
    -newer otherfile    #文件比otherfile更新
    -type c         #文件类型为c,c是一个特殊类型,如d(目录)、f(普通文件)等
    -user username     #文件的拥有者是username指定的用户     还可以使用操作符来进行组合测试
    !       -not       #测试取反
    -a       -and       #与运算
    -o       -or        #或运算     actions说明:
    -exec command        #执行一条命令,这个动作必须使用 \; 字符对来结束,常用!!!
    -ok command         #与-exec类似,但在执行前会针对每个要处理的文件,提示用户进行确认,也必须使用 \; 字符对来结束
    -print            #打印文件名
    -ls              #对当前文件使用命令ls
说明:{}是-exec或-ok命令的一个特殊类型参数,它将被当前文件的完整路径取代
补充:-exec结合多个命令。-exec参数每次只能直接执行单个命令,但是我们可以把多个命令写到一个script中,然后在-exec后将单个命令替换为执行script的命令,{}将作为script的参数传递给script
范例:find ./ -name "*.gch" -exec rm {} \;   #在当前目录下递归查找文件名以 .gch 结尾的文件并删除他们

总结:shell的功能真的是很强大,刚开始学习就利用shell script快速地完成了很多操作,特别是用find命令来查找文件,屡试不爽啊!

bash shell学习-shell script基础 (笔记)的更多相关文章

  1. Shell学习——Shell分类:登录shell和非登陆shell 交互shell和非交互shell

    1.从两个不同维度来划分,是否交互式,是否登录 2.交互式shell和非交互式shell 交互式模式:在终端上执行,shell等待你的输入,并且立即执行你提交的命令.这种模式被称作交互式是因为shel ...

  2. bash shell学习-shell基础 (笔记)

    When you hoist the sails to cross the sea, you willride the wind and cleave the waves. "长风破浪会有时 ...

  3. 【shell】《shell学习指南》读书笔记

    一.使用shell脚本 优点:脚本语言能够轻易处理文件与目录之间的对象,如把文件从所有目录拷贝到另一个目录 缺点:效率不如编译型语言 二.简单的脚本 1.查看现在系统有谁登录 $who 2.算出行数 ...

  4. Shell学习---Shell脚本的静态检查工具shellcheck

    Shell脚本的静态检查工具shellcheck ubuntu下 apt install shellcheck ,即可安装shellcheck.写完shell脚本,记得用它检查一下,能给你点建议的.要 ...

  5. [转帖][Bash Shell] Shell学习笔记

    [Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html  阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...

  6. [Bash Shell] Shell学习笔记

    1. Shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命 ...

  7. 菜鸟教程之学习Shell script笔记(上)

    菜鸟教程之学习Shell script笔记 以下内容是,学习菜鸟shell教程整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-shell.ht ...

  8. shell学习笔记汇总

    1.shell脚本中函数使用 函数定义在前,调用在后,顺序反了就没有效果了.函数调用为:函数名 参数列表 函数内部通过以下变量访问函数的参数:shell脚本函数中: $0: 这个脚本的名字 $n: 这 ...

  9. shell学习笔记

    shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...

随机推荐

  1. 【转】 Linux IIO子系统分析-1-概述

    原文网址:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=20543672&id=2976189 最近稍微看了下LKML ...

  2. 在Apache+php中使用json来通讯

    示例代码: <?php // 获取输入的内容 $request = http_get_request_body(); // 按json格式解析成一个 php对象 $json_obj = json ...

  3. 《University Calculus》-chape4-导数的应用-极值点的二阶导数检验法

    函数凹凸性检验: 很容易看到,观察类似抛物线这类曲线,能够看到它们有一个向上凹或者向下凹的这样一个过程,而我们将这个过程细化并观察一系列点的导数的变化情况我们给出如下的定义: (1)如果函数图像在区间 ...

  4. K - Candies(最短路+差分约束)

    题目大意:给N个小屁孩分糖果,每个小屁孩都有一个期望,比如A最多比B多C个,再多了就不行了,会打架的,求N最多比1多几块糖 分析:就是求一个极小极大值...试试看 这里需要用到一个查分约束的东西 下面 ...

  5. SVN强制注释

    1.目的 在使用SVN作为版本控制的时候,强制提交的人员写注释,这样能确保每次提交都有注释,方便查看 2.解决办法     2.1给工程加上属性          2.1.1在工程提交之后,通过客户端 ...

  6. Amazon API Gateway Importer整合过程小结

    (1)需要将swagger json转换成amazon api gateway 所需要的格式(根据Method Request中 Request PathsURL Query String Param ...

  7. 程序启动原理和UIApplication

    iOS开发UI篇—程序启动原理和UIApplication   一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...

  8. POJ1184-------操作分离的BFS

    题目地址:http://poj.org/problem?id=1184 题目意思: 给你两个6位数,一个是起始值,一个最终值 初始光标在最左边 你可以左移或者右移光变 在光标处+1或者-1 在光标处和 ...

  9. LVS图解 ---阿里

    LVS在大规模网络环境中的应用   1. SLB总体架构   LVS本身是开源的,我们对它进行了多方面的改进,并且也已开源-https://github.com/alibaba/LVS.     接下 ...

  10. 数据存储简单了解(NSUserDefaults)

    数据存储-使用NSUserDefaults 两个类介绍: NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefault ...