本文涉及的命令:test、[]、shift、if、case、for、while、until、function、sh。

  1. 撰写 shell script 的良好习惯
    •   在每个 script 的文件头处记录好:
    •     script 的功能;
    •     script 的版本信息;
    •     script 的作者与联绚方式;
    •     script 的版权宣告方式;
    •     script 的 History (历叱纪录);
    •     script 内较特殊的指令,使用『绛对路径』的方式来下达;
    •     script 运作时需要的环境变量预先宣告与设定
  2. 变量替换(赋值)
    1. $variable    保存在variable中的值
    2. ${variable}    保存在variable中的值
    3. ${variable:-string}  如果variable的值非空,则值为variable,否则值为string
    4. ${variable:+string}  如果variable的值非空,则值为string,否则值为空
    5. ${variable:=string}  如果variable的值非空,则值为variable,否则值为string且variable的值设置为string
    6. ${variable:?string}  如果variable的值非空,则值为variable,否则显示string并退出
    7. ${变量名}字符-----------------使用大括号,给变量后面加一些特定的字符
  3. "basename $0" 显示程序名,去掉目录信息
  4. 变量在引用时不带引号,则空格和换行符会被删除,带引号则会保留。
  5. test------------------测试
    1. 关于某个档名的『文件类型』判断,如 test -e filename 表示存在否

      • -e 该『档名』是否存在?(常用)
      • -f 该『档名』是否存在且为档案(file)?(常用)
      • -d 该『文件名』是否存在且为目录(directory)?(常用)
      • -b 该『档名』是否存在且为一个 block device 装置?
      • -c 该『档名』是否存在且为一个 character device 装置?
      • -S 该『档名』是否存在且为一个 Socket 档案?
      • -p 该『档名』是否存在且为一个 FIFO (pipe) 档案?
      • -L 该『档名』是否存在且为一个连结档?
    2. 关于档案的权限侦测,如 test -r filename 表示可读否 (但 root 权限常有例外)
      • -r 侦测该档名是否存在且具有『可读』的权限?
      • -w 侦测该档名是否存在且具有『可写』的权限?
      • -x 侦测该档名是否存在且具有『可执行』的权限?
      • -u 侦测该文件名是否存在且具有『SUID』的属性?
      • g 侦测该文件名是否存在且具有『SGID』的属性?
      • -k 侦测该文件名是否存在且具有『Sticky bit』的属性?
      • -s 侦测该档名是否存在且为『非空白档案』?
    3. 两个档案之间的比较,如: test file1 -nt file2
      • -nt (newer than)判断 file1 是否比 file2 新 
      • -ot (older than)判断 file1 是否比 file2 旧
      • ef 判断 file1 与 file2 是否为同一档案,可用在判断 hard link 的判定上。主要意义在判定,两个档案是否均指向同一个 inode。
    4. 关于两个整数之间的判定,例如 test n1 -eq n2
      • -eq 两数值相等 (equal)
      • -ne 两数值不等 (not equal)
      • -gt n1 大于 n2 (greater than)
      • -lt n1 小于 n2 (less than)
      • -ge n1 大于等于 n2 (greater than or equal)
      • -le n1 小于等于 n2 (less than or equal)
    5. 判定字符串的数据
      • test -z string   判定字符串是否为 0 ?若 string 为空字符串,则为 true
      • test -n string   判定字符串是否非为 0 ?若 string 为空字符串,则为 false。注: -n 亦可省略
      • test str1 = str2  判定 str1 是否等于 str2 ,若相等,则回传 true。
      • test str1 != str2  判定 str1 是否不等于 str2 ,若相等,则回传 false
    6. 多重条件判定,例如: test -r filename -a -x filename
      • -a  (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有r 与 x 权限时,才回传 true。
      • -o  (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有r 或 x 权限时,就可回传 true。
      • !  反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true
  6. []------------和test的功能相同
    • 1.在中括号 [] 内的每个组件都需要有空格键来分隔;
    • 2.在中括号内的变数,最好都以双引号括号起来;
    • 3.在中括号内的常数,最好都以单或双引号括号起来。
  7. script 的执行方式差异 (source, sh script, ./script)
    • 1.利用直接执行的方式来执行 script,是子程序运行 (子程序中的变量无法在父程序中运行)
    • 利用 source 来执行脚本:在父程序中执行。例:source sh02.sh
  8. Shell script 的默认变数($0, $1...)
    • /path/to/scriptname opt1 opt2 opt3 opt4

      • $0                  $1   $2     $3    $4
    • $# :代表后接的参数『个数』,以上表为例这里显示为『 4 』;
    • $@ :代表『 "$1" "$2" "$3" "$4" 』之意,每个变量是独立的(用双引号括起来);
    • $* :代表『 "$1c$2c$3c$4" 』,其中 c 为分隑字符,默认为空格键, 所以本例中代表『 "$1 $2 $3 $4" 』之意。
  9. shift:造成参数变量号码偏移
    • shift 会移动变量,而且 shift 后面可以接数字,代表拿掉最前面的几个参数的意思。
    • 例: echo "Total parameter number is ==> $#"
      • echo "Your whole parameter is ==> '$@'"
      • shift # 进行第一次『一个变量的 shift 』
      • echo "Total parameter number is ==> $#" -----这次显示的会比上次少一个
      • echo "Your whole parameter is ==> '$@'" -----这次显示会比上次的少最左边那个参数
      • shift 3 # 进行第二次『三个变量的 shift 』
      • echo "Total parameter number is ==> $#"
      • echo "Your whole parameter is ==> '$@'"
  10. 条件判断式-----------------------------if中的运算符必须在两个[]之间。
    1. 单层、简单条件判断式

      • if .... then

        • if [ 条件判断式 ];

          • then 当条件判断式成立时,可以进行的指令工作内容;
        • fi <==将 if 反过来写,就成为 fi 啦!结束 if 之意!
        • && 代表 AND ;
        • || 代表 or ;
        • 例: read -p "Please input (Y/N): " yn
          • if [ "$yn" == "Y" ] || [ "$yn" == "y" ];

            • then echo "OK, continue"
            • exit 0
          • fi
          • if [ "$yn" == "N" ] || [ "$yn" == "n" ];
            • then echo "Oh, interrupt!"
            • exit 0
          • fi
          • echo "I don't know what your choice is" && exit 0
    2. 多重、复杂条件判断式
      1. 一个条件判断

        • if [ 条件判断式 ];

          • then 当条件判断式成立时,可以进行的指令工作内容;
          • else 当条件判断式不成立时,可以进行的指令工作内容;
        • fi
      2. 多个条件判断 (if ... elif ... elif ... else) 分多种不同情况执行
        • if [ 条件判断式一 ];

          • then 当条件判断式一成立时,可以进行的指令工作内容;
        • elif [ 条件判断式二 ];
          • then 当条件判断式二成立时,可以进行的指令工作内容;
        • else
          • 当条件判断式一与二均不成立时,可以进行的指令工作内容;
        • fi
    3. case ... in .... esac-----------------(实际案例)
      • case $变量名称 in <==关键词为 case ,还有变数前有钱字号

        • "第一个变量内容") <==每个变量内容建议用双引号括起来,关键词则为小括号 )

          • 程序段
          • ;; <==每个类删结尾使用两个连续的分号来处理!
        • "第二个变量内容")
          • 程序段
          • ;;
        • *) <==最后一个变量内容都会用 * 来代表所有其他值
          • 不包含第一个变量内容与第二个变量内容的其他程序执行段
          • exit 1
          • ;;
      • esac <==最终的 case 结尾!
    4. function 功能------------函数
      • function fname()    --------fname为自定义名称

        • {

          • 程序段 ------程序内也可以使用变量($1...),在调用时直接函数名加变量数字
        • }
    5. while do done, until do done (不定循环)
      • while [ condition ] <==中括号内的状态就是判断式

        • do <==do 是循环的开始!

          • 程序段落
        • done <==done 是循环的结束
      • until [ condition ]
        • do

          • 程序段落
        • done
    6. for...do...done (固定循环)  ---------------已知要循环几次
      • for var in con1 con2 con3 ...

        • do

          • 程序段
        • done
    7. for (( 初始值; 限制值; 执行步阶 )) -------------数值的处理
      • do

        • 程序段
      • done
  11. shell script 的追踪与 debug
    • sh [-nvx] scripts.sh

      • -n :不要执行 script,仅查询语法的问题;
      • -v :再执行 sccript 前,先将 scripts 的内容输出刡屏幕上;
      • -x :将使用刡的 script 内容显示刡屏幕上,这是很有用的参数!

============================================================================

() 和 {}的区别
这两个都是对一串命令的执行,但有些区别
1.()只是对一串命令重新开一个子进程进行执行
 {}是在当前进程执行
2.()和{}内的命令都是以;隔开
 ()最后一个命令可以不用分号;
 {}最后一个分号需要
3.()第一个命令不需要和括号间有空格
 {}第一个命令和左边的括号间有空格
 
对于1:
$ var=10
$ (var=20;echo $var)
20
$ echo $var
10
说明()中执行的语句没有调用当前的变量,所以是在子进程中实现
 
 
$ var=30
$ { var=40;echo $var } #第一个要有空格哦
40
$ echo $var
40
说明var被修改了,是在同一个进程中实现
--------------------------------------------------------------------------------------------------------------------
2.POSIX标准的扩展计算:$((exp))
这种计算是符合C语言的运算符,也就是说只要符合C的运算符都可用在$((exp)),甚至是三目运算符。
注意:这种扩展计算是整数型的计算,不支持浮点型.若是逻辑判断,表达式exp为真则为1,假则为0。
$ echo $((3+2))
5
$ echo $((3>2))
1
$ echo $((25<3 ? 2:3))
3
$ echo $var
$ echo $((var=2+3))
5
$ echo $var
5
$ echo $((var++))
5
$ echo $var
6
-----------------------------------------------------------------------------------------------------------------------

shell scripts的更多相关文章

  1. 第十三章、学习 Shell Scripts

    什么是 Shell scripts shell script (程序化脚本) :shell script 是针对 shell 所写的『脚本!』 shell script 是利用 shell 的功能所写 ...

  2. React native采坑路 Running 1 of 1 custom shell scripts

    1. Running 1 of 1 custom shell scripts 卡住的问题. 分析: 四个文件没有下载完成. boost_1_63_0.tar.gz folly-2016.09.26.0 ...

  3. 鸟哥的 Linux 私房菜Shell Scripts篇(一)

    参考: http://linux.vbird.org/linux_basic/0340bashshell-scripts.php#script_be http://www.runoob.com/lin ...

  4. 鸟哥的Linux私房菜——第十六章:学习Shell Scripts

    视频链接:http://www.bilibili.com/video/av10565321/ 1. 什么是 Shell Script       (shell写的脚本)1.1 干嘛学习 shell s ...

  5. 鸟哥的Linux私房菜-第10/11/12/13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)

    第10章 vim程序编辑器 可以将vim看做vi的进阶版本,vim可以用颜色或底线等方式来显示出一些特殊的信息. 为何要学习vim?因为: a. 所有的 Unix Like 系统都会内建 vi 文书编 ...

  6. linux source命令与sh shell scripts的区别

    source FileName 作用:在当前bash环境下读取并执行FileName中的命令. 注:该命令通常用命令“.”来替代. 如:source .bash_rc 与 . .bash_rc 是等效 ...

  7. Expect Command And How To Automate Shell Scripts Like Magic

    In the previous post, we talked about writing practical shell scripts and we saw how it is easy to w ...

  8. 鸟哥的linux私房菜——第十二章学习(Shell Scripts)

    第十二章  Shell Scripts 1.0).什么是shell scripts? script 是"脚本.剧本"的意思.整句话是说, shell script 是针对 shel ...

  9. 第十三章、学习 Shell Scripts 条件判断式

    利用 if .... then 单层.简单条件判断式 if [ 条件判断式 ]; then 当条件判断式成立时,可以进行的命令工作内容: fi <==将 if 反过来写,就成为 fi !结束 i ...

随机推荐

  1. CVE-2014-6271 Bash漏洞利用工具

    CVE-2014-6271 Bash漏洞利用工具 Exploit 1 (CVE-2014-6271) env x='() { :;}; echo vulnerable' bash -c "e ...

  2. MySQL性能优化总结(转)https://yq.aliyun.com/articles/24249

    摘要: 一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图:   三.MySQL存储引擎概述 1)MyISAM存储引擎 MyIS ...

  3. mysql的ONLY_FULL_GROUP_BY语义 --转自http://www.wtoutiao.com/p/19dh3ec.html

    执行SET GLOBAL sql_mode = ''; 把sql_mode 改成非only_full_group_by模式.验证是否生效 SELECT @@GLOBAL.sql_mode 或 SELE ...

  4. thrift demo

    基于上一篇博客,安装thrift complier之后,就需要进行跑跑程序,来看看是否如同预期的那种效果. 前面的thrift compiler的主要作用,其实就是为了IDL的,就是防止客户端和服务端 ...

  5. Debian系统常用配置

    每一次安装Linux之后总需要设置一下系统,下面把常用的设置总结一下,方便以后使用: 1.系统安装包选择 每一次找Linux的安装包时,总会纠结一下选哪个好,我在这里总结一下:安装Debian选择对应 ...

  6. [转]N种内核注入DLL的思路及实现

    内核注入,技术古老但很实用.现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中.可能有部分人会说:“都进内核了.什么不能干?”.是啊,要是内核中可以做包括R3上所有能做的事,软 ...

  7. git配置管理

    生成 SSH 公钥 如前所述,许多 Git 服务器都使用 SSH 公钥进行认证. 为了向 Git 服务器提供 SSH 公钥,如果某系统用户尚未拥有密钥,必须事先为其生成一份. 这个过程在所有操作系统上 ...

  8. Struts2实现简单的在线人数统计

    用Strust2框架的知识简单实现一个统计在线人数的问题. 1 搭建开发环境:(配置文件,jar包等问题) 2 index.jsp <%@ page language="java&qu ...

  9. <<敏捷开发>>读书笔记

    1.走进敏捷 * 组织成功 增加业务专家,较少bug和测试的交流成本,即使取消不好的技术 首先发布最有价值的特性,时常发布新的版本,即使改进软件 * 技术成功 结对编程,代码审核,确保同一份代码有不同 ...

  10. 利用docker搭建rtmp服务器(1)

    以后的项目里面可能需要用到直播,所以就先看看 本来想在自己MAC上搭建nginx的,后来怕把自己的机子搞乱,刚好就学习了下docker,感觉docker强大就在于是一个操作系统软件的版本管理系统,可以 ...