Shell script学习总结
shell script注意事项
- 命令的执行顺序 从上至下,从左至右
- 命令的执行:命令,参数间的多个空白都会被忽略掉
- 空白行也将被忽略掉,并且[tab]键所得的空白被同样视为空格键。
- 如果一行内容太多可以用“[Enter]”来扩展到下一行。
- “#”之后的语句是注释语句。执行时将被忽略。
Shell script的执行
假设我们有一个/home/doris/shell.sh
脚本文件,执行该脚本文件的方法有如下几种:
- 直接命令执行, shell.sh必须有具备可读与可执行(rx)权限,然后:
- 绝对路径执行:/home/doris/shell.sh
- 相对路径执行:当前工作目录在
/home/doris
,则命令为 ./shell.sh - 变量"PATH"功能,将
shell.sh
放置在PATH指定的目录内,例如: ~/bin/.
- 以bash进程来执行(此时shell.sh只需要有r权限即可):通过"bash shell.sh"或"sh shell.sh"来执行,记住用这个方式来执行的时候要先进入到该文件所在目录中。
-
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程序的结构:
- 每一个shell文件第一行必须有类似
#!/bin/bash
用来申明使用什么shell来执行,而这里我们是用bash来执行shell。 - 程序说明用
#
来注释对这个文件的说明。 - 主要环境变量的说明,一般用来定义PATH变量。(用set -可以用来查看当前设置的环境变量)。比较重要的环境变量还有
LANG
与文件编码有关,有时候得到的结果与预期的不一样的时候,你可以先检查一下编码是否和你的预期的一样。 - 主要程序部分,命令的集合。
- 每一个shell文件第一行必须有类似
-
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