zoukankan      html  css  js  c++  java
  • bash shell学习-shell script基础 (笔记)

      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的默认变量

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

    四、条件判断式

      1、if ... then

    1 if [ expr1 ]; then
    2   dosomething
    3 elif [ expr2 ]; then
    4   dosomething
    5 ...
    6 else
    7   dosomething
    8 fi

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

      2、case ... esac

     1 case $变量名 in
     2      "var1")
     3           dosomething
     4           ;;
     5      "var2")
     6           dosomething
     7           ;;
     8        ...
     9      *)
    10            dosomething
    11           ;;
    12 esac       

      3、使用函数(function)

    1 function fname()
    2 {
    3   dosomething
    4 }

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

     

    五、循环

      1、while do done

    1 while [ condition ]
    2 do
    3   dosomething
    4 done

      2、until do done

    1 until [ condition ]
    2 do
    3   dosomething
    4 done

      3、for...do...done

    1 for var in con1 con2 ...
    2 do
    3   dosomething
    4 done
    5 for ((初始值;限制值;执行步长))   --用于数值处理 6 do 7   dosomething 8 done

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

     

    六、shell script的追踪与调试

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

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

      1、trap:信号处理

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

      2、find:查找文件

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

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

  • 相关阅读:
    把arguments转化成数组
    最小化重绘和重排
    选择器API
    事件委托
    WAhaha_hnu (zoj 2010 oct月赛)
    素数计数公式全面拉丁化改写小有改进Meissel公式梅塞尔Lehmer公式莱梅=勒梅尔筛法三种形式孟庆余公式(转载)
    NBUT 2013 Timed NOJ Training #005
    2013 腾讯马拉松初赛第一场
    hrboj 1683 树形DP
    哈尔滨2013校赛训练赛 4 解题思路
  • 原文地址:https://www.cnblogs.com/autyinjing/p/4612165.html
Copyright © 2011-2022 走看看