现在的位置: 首页 > 综合 > 正文

Linux下的SHELL脚本

2013年12月04日 ⁄ 综合 ⁄ 共 2202字 ⁄ 字号 评论关闭

Linux下的SHELL脚本常以 *.sh 为后缀,和Windows下的批处理脚本 *.bat *.cmd功能一致,但是功能和语法都要更强大。SHELL是一门脚本语言。本文介绍SHELL的语法及用法。

1. 开始使用

在Linux下新建一个文本文件,命名为test.sh,并输入以下内容:

  1. #!/bin/sh  
  2. 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)

举例来说,用点号执行以下脚本

  1. #!/bin/sh  
  2. TEST_HOME=here  

和用命令执行 

  1. #!/bin/sh  
  2. export TEST_HOME=here  

效果是一样的。下面我们统一用(1)种办法来执行脚本,因此也要求显示地用export来输出变量。

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中也是支持函数的定义的。例如:

  1. #!/bin/sh  
  2.   
  3. function my_test()  
  4. {  
  5.     _ARG1=$1;  
  6.     _ARG2=$2;  
  7.     echo "Got Argument: ${_ARG1}, ${_ARG2}"  
  8.         return 0;  
  9. }  
  10.   
  11. my_test  aaa  bbb  

注:

- 函数的参数不会显式的列在括号里,但可以在代码里用 $1, $2 ... 引用
- 参数的个数貌似是有限制的,应该是从1到9
- 函数调用时,把参数列在后面,以空格分开,末尾不用加分号
- 函数可以return一个整数,作为返回码。也可以直接return退出函数

5. 条件测试

在if ... else, while等控制语句,必须有条件测试。

  1. #!/bin/sh  
  2.   
  3. if [ -f a.txt ]; then  
  4.     echo "File Exist."  
  5. else  
  6.     echo "File Not Exist."  
  7. fi  

注意方括号内[ ],这里就是测试条件。其中 -f a.txt表示判断a.txt是否存在。【注】方括号内左右都要有空格,不能把各部分连在一起写

文件条件测试

-d  是否为目录
-f   是否为文件
-L 是否为链接
-r 是否可读
-w 是否可写
-s 是否为空(长度为0)
-x 是否可执行
-u 是否有suid标志

字符串条件测试

=  字符串相同
!= 字符串不等
-z 字符串为空
-n 字符串非空
字符串测试时,要把变量放在引号里,下面是一个例子

  1. NAME=a  
  2. if [ -z "$NAME" ]; then  
  3.     echo "String Is Null."  
  4. else  
  5.     echo "String Is Not Null."  
  6. 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

(2)

抱歉!评论已关闭.