本文涉及的命令: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. QPS/QPS/PV/UV/服务器数量/并发数/吐吞量/响应时间计算公式

    QPS:每秒查询率(Query Per Second) ,每秒的响应请求数,也即是最大吞吐能力.QPS = req/sec = 请求数/秒QPS统计方式 [一般使用 http_load 进行统计]QP ...

  2. linux 常用的酷炫命令

    1 命令行日常系快捷键 如下的快捷方式非常有用,能够极大的提升你的工作效率: CTRL + U -剪切光标前的内容 CTRL + K -剪切光标至行末的内容 CTRL + Y -粘贴 CTRL + E ...

  3. Maven项目

    1,创建项目,类似于创建一个VS.net 项目的 解决方案.    http://stackoverflow.com/questions/6328778/how-to-create-an-empty- ...

  4. osx 文本编辑工具下载地址Sublime Text 3

    下载地址: http://www.sublimetext.com/3 Sublime Text 是一个代码编辑器(Sublime Text 3是收费软件,但可以无限期试用),也是HTML和散文先进的文 ...

  5. knockout 学习实例7 foreach

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. bzoj3745: [Coci2015]Norma

    Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. 预处理每个位置的数作为最小/大值向左延伸的最大距离, ...

  7. 【Linux】浅谈段页式内存管理

    让我们来回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址.如果这个系统只运行一个程序,那么只要这个程序所需的内存不要超过该机器的物理内存 ...

  8. python Requests库在处理response时的一些陷阱

    python的Requests(http://docs.python-requests.org/en/latest/)库在处理http/https请求时还是比较方便的,应用也比较广泛.但其在处理res ...

  9. Sqlite: FOREIGN KEY constraint failed on remove的错误原因。

    sqlite外键约束中.restrict约束:如果要删除父表,则子表需空. 如果没有定义约束.会报错,需设置一个约束.

  10. Fighting Game

    感谢上外静中任淳同学提供   uses crt; label   h;         //h是重新开始游戏 const   y1=18;   y2=18;       //p1,p2的纵坐标 var ...