Shell Script初入门

Shell script学习总结

shell script注意事项

  1. 命令的执行顺序 从上至下,从左至右
  2. 命令的执行:命令,参数间的多个空白都会被忽略掉
  3. 空白行也将被忽略掉,并且[tab]键所得的空白被同样视为空格键。
  4. 如果一行内容太多可以用“[Enter]”来扩展到下一行。
  5. “#”之后的语句是注释语句。执行时将被忽略。

Shell script的执行

假设我们有一个/home/doris/shell.sh脚本文件,执行该脚本文件的方法有如下几种:

  1. 直接命令执行, shell.sh必须有具备可读与可执行(rx)权限,然后:
    • 绝对路径执行:/home/doris/shell.sh
    • 相对路径执行:当前工作目录在/home/doris,则命令为 ./shell.sh
    • 变量"PATH"功能,将shell.sh放置在PATH指定的目录内,例如: ~/bin/.
  2. 以bash进程来执行(此时shell.sh只需要有r权限即可):通过"bash shell.sh"或"sh shell.sh"来执行,记住用这个方式来执行的时候要先进入到该文件所在目录中。
  3. source shell.sh也可以用来执行shell.sh文件,与"sh shell.sh"区别在于source执行的bash进程就是父进程,而bash是在子进程中执行,在子进程中执行的命令的变量不会作用于主进程,只在子进程中起作用。

shell追踪与调试

在用sh执行shell脚本的时候可以对执行追踪与调试。
命令如下:

sh [-nvx] shell.sh
参数:
-n: 不需要执行shell.sh,仅仅查询语法的问题。
-v: 在执行script前,先将script的内容输出到屏幕上。
-x: 将使用到的script内容显示在屏幕上,可以跟踪每一个执行的命令。

在这个命令中,-x是一个非常有用的参数,可以帮助我们查看sh执行的过程,快速定位错误在那里。

Shell script 语法

  • 编写shell script程序的结构:

    1. 每一个shell文件第一行必须有类似#!/bin/bash用来申明使用什么shell来执行,而这里我们是用bash来执行shell。
    2. 程序说明用#来注释对这个文件的说明。
    3. 主要环境变量的说明,一般用来定义PATH变量。(用set -可以用来查看当前设置的环境变量)。比较重要的环境变量还有LANG与文件编码有关,有时候得到的结果与预期的不一样的时候,你可以先检查一下编码是否和你的预期的一样。
    4. 主要程序部分,命令的集合。
  • test命令
    1 "文件类型"判断
    test xxx filename

       参数      意义
       -e    该文件是否存在
       -f    该文件是否存在且为文件
       -d    该文件是否存在且为目录
       -b    该文件是否存在且为一个block device 设备
       -L    该文件是否存在且为一个连接文件
       -c    该文件是否存在且为一个character device设备
       -S    该文件是否存在且为一个Socket文件
       -p    该文件是否存在且为一个FIFO(pipe)文件
    

    2 文件权限检测
    test xxx filename

      参数   意义
      -r   该文件是否存在且具有可读权限
      -x   该文件是否存在且具有可执行权限
      -w   该文件是否存在且具有可写权限
      -s   该文件是否存在且为"非空白文件" 
    

    3 两个文件之间的比较
    test file1 xx file2

    参数  意义
    -nt (newer than)判断file1是否比file2新
    -ot (older than)判断file1是否比file2旧
    -ef 判断两个文件是否是同一个文件,主要在于判断两个文件是否指向同一个文件结点
    

    4 两个整数之间的判断
    test n1 xx n2

    参数  意义
    -eq n1是否等于n2(equal)
    -ne 不相等
    -gt n1大于n2
    -lt n1小于n2
    -ge n1大于等于n2    
    
    

    5 字符串判断

    Test -Z string 判断字符串是否为0,字符串为空字符串,返回为true。
    Test -n string 判断字符串是否非空,字符串非空时,返回true。
    test str1=str2 判断两字符串是否相等
    test str1!=str2 判断两字符串不相等

    6 多重条件判断连接符
    -a and
    -o or
    ! 非

    PS:
    1 除了用test命令之外,可以用[]判断符号,比如[ -z "$home" ]判断$home是否为空。还有一个需要注意的是,因为[]使用的地方很多,所以在作为判断符号的时候,中括号的两端需要空格键分隔。

  • 中括号内的每个组件都需要空格键来分隔

  • 中括号中的变量最好都以双引号括起来

  • 中括号中的常量最好都用单引号与双引号括起来
    原因如下:
    name="doris's jianshu"
    [ $name == "doris's jianshu" ]
    执行之后你会发现报错: too many arguments
    为什么呢? 分析一下原因:展开上述判断式为[ doris's jianshu = "doris's jianshu"]这样就有'doris's','jianshu'以及'doris's jianshu'三个参数,而判断式仅能两个数据比较。所以就报错了。所以应该加上双引号,变成[ "doris's jianshu" == "doris's jianshu"].

2 在bash当中===是一样的,不过一般用=表示变量的设置,==用于逻辑判断。

  • shift 用于参数变量号码偏移, shift 3表示参数偏移3个,从第四个开始取。

  • 默认变量,在shell script存在默认变量名,比如下面这个命令:

    /home/doris/shell.sh 1, 2, 3
    $0 $1 $2 $3
    其中参数1,默认变量名为$1,所以在shell文件中可以利用$1来代表第一个参数,从而对它操作。

条件判断式

1 if[];...then...fi
2 if[];...then..elif[];..then...else..fi
3 当变量是固定值的时候,可以使用case判断式,如果有学习过JAVA的,其实就相当于switch语句。
case $变量名称 in
"第一个变量内容")
;;
"第二个变量内容")
;;
*)//其他变量
;;
esac

循环(loop)

1 while [condition] 当condition不成立时才停止。
do
程序段落
done

2 until [condition] 当condition成立时才停止与while do done相反。
do
程序段落
done
3 for var in con1,con2,con3 依次读取con1,con2,con3执行程序段落
do
程序段落
done
4 for ( ( 初始值1; 限制值; 执行步长) )
do
程序段落
done

你可能感兴趣的:(Shell Script初入门)