Linux下的SHELL脚本常以 *.sh 为后缀,和Windows下的批处理脚本 *.bat *.cmd功能一致,但是功能和语法都要更强大。SHELL是一门脚本语言。本文介绍SHELL的语法及用法。
1. 开始使用
在Linux下新建一个文本文件,命名为test.sh,并输入以下内容:
- #!/bin/sh
- echo hello,world
【注】
- 第1行是必须的,用以表示本脚本由哪个程序来执行,此处是用 /bin/sh 程序执行
- 文本文件要使用unix/linux格式,即换行符为\n;与此对照的是,Windows下建立的文件文件是以 \r\n结尾。可以用三种方法确保这一点:
(1) 对于新手来说,可以在Linux下用vi或gedit来建立此文件,可以保证是unix格式
(2) 或者在windows下建立此文件,然后在linux使用dos2unix命令来改格式
(3) 在Windows下,用Notepad++软件进行编辑, 在菜单的"编辑 | 档案格式转换 | 转为unix格式"
2. 执行脚本
脚本在书写好了之后,有几种执行方法。
(1) sh test.sh
这里用/bin/sh这种程序来解释执行test.sh
(2) ./test.sh
这是把test.sh当作一个可执行文件来执行。要求:
- test.sh有可执行属性 chmod +x test.sh
- test.sh第一行是 #!/bin/sh
(3) . test.sh
点号也是可以执行脚本的。和前面的区别是,用点号执行时脚本的变量将自动输出到当前环境中。而用前面2种方法执行时,脚本中的变量不会注入到当前环境(除非显示地export)
举例来说,用点号执行以下脚本
- #!/bin/sh
- TEST_HOME=here
- #!/bin/sh
- export TEST_HOME=here
3. 变量
SHELL里的变量都是字符串
(1) 变量定义
AUTHOR_NAME=shaofa
USER_COUNT=12
【注】
- 等号两边不可以用空
- 变量的值会被看作字符串,不会被看作数字 【这可能有点难以理解,通常用expr函数来得到一个数字】
- 语句无需以分号结尾
- 值不需要用引号括起来
(2) 变量使用
$AUTHOR_NAME
或
${AUTHOR_NAME}
用$表示取变量的值
(3) 变量导出
export AUTHOR_NAME=shaofa
或
AUTHOR_NAME=shaofa
export AUTHOR_NAME
(4) 取消变量
unset AUTHOR_NAME
可以从当前环境变量里取消一个变量
4. 函数
SHELL中也是支持函数的定义的。例如:
- #!/bin/sh
- function my_test()
- {
- _ARG1=$1;
- _ARG2=$2;
- echo "Got Argument: ${_ARG1}, ${_ARG2}"
- return 0;
- }
- my_test aaa bbb
注:
- 函数的参数不会显式的列在括号里,但可以在代码里用 $1, $2 ... 引用
- 参数的个数貌似是有限制的,应该是从1到9
- 函数调用时,把参数列在后面,以空格分开,末尾不用加分号
- 函数可以return一个整数,作为返回码。也可以直接return退出函数
5. 条件测试
在if ... else, while等控制语句,必须有条件测试。
- #!/bin/sh
- if [ -f a.txt ]; then
- echo "File Exist."
- else
- echo "File Not Exist."
- fi
注意方括号内[ ],这里就是测试条件。其中 -f a.txt表示判断a.txt是否存在。【注】方括号内左右都要有空格,不能把各部分连在一起写
文件条件测试
-d 是否为目录
-f 是否为文件
-L 是否为链接
-r 是否可读
-w 是否可写
-s 是否为空(长度为0)
-x 是否可执行
-u 是否有suid标志
字符串条件测试
= 字符串相同
!= 字符串不等
-z 字符串为空
-n 字符串非空
字符串测试时,要把变量放在引号里,下面是一个例子
- NAME=a
- if [ -z "$NAME" ]; then
- echo "String Is Null."
- else
- echo "String Is Not Null."
- fi
数值测试
-eq 即=
-ne 即!=
-gt 即>
-lt 即<
-ge 即>=
-le 即<=
数值比较时,可以把变量放在引号,也可以不用引号
多个条件的与或关系
条件与: -a
条件或: -o
例:
[ -f 1.txt -a -f 2.txt ] 表示文件1.txt和2.txt同时存在为有效
6. 流程控制
(1) if ... else
if [ 条件 ]; then
....
fi
或
if [ 条件 ]; then
....
elif [ 条件 ] ; then
....
else
....
fi