一、shell脚本建立:
shell脚本通常是在编辑器(如vi/vim)中编写,也可以在命令行中直接执行;
1、脚本开头:
规范的脚本第一行需要指出有哪个程序(解释器)来执行脚本中的内容,在Linux中一般为:
#!/bin/sh
或者
#!/bin/bash
“#!”,在执行脚本时,内核会根据“#!/bin/sh”来确定使用bash程序来解释脚本,这行必须在脚本顶端(第一行),如果非第一行则表示注释。
如果不是使用“#!/bin/sh”而是使用其他的例如:“# !/usr/bin/env python” 则表示使用python来解释程序。
2、脚本注释:
在shell中常常会有解释说明脚本所需要实现的功能,或者其他信息,那么久需要对脚 本进行注释说明:如何注释说明呢?
在注释的内容前面增加“#”则可以表示后面内容为注释。如果没有注释,非脚本开发人 员很难理解脚本的实现功能,而且时间长了即使是脚本开发则也可能忘记脚本所实现的功 能。因此良好的习惯在于书写注释,方便别人也方便自己。
二、变量:
在所有编程中都会涉及到变量。那么在shell中如何定义是使用变量呢?
1、直接定义变量内容:
例、ip=10.1.1.1
ip=10.1.1.1-$ip
这种情况下,变量的内容一般为简单的连续的数字,字符串,路径名。那么这个ip输出的 值是多少呢?以下是测试情况。
1 [root@ipv6-1-16 init.d]# ip=10.1.1.1 2 [root@ipv6-1-16 init.d]# ip=10.1.1.1-$ip 3 [root@ipv6-1-16 init.d]# echo $ip 4 10.1.1.1-10.1.1.1
2、通过单引号来定义变量,此种方式特点是:输出变量是单引号中是什么就输出什么,即使 引号中的内容有变量也会直接把变量原样输出。此法为定义纯字符串变量。
1 [root@ipv6-1-16 init.d]# ip=10.1.1.1 2 [root@ipv6-1-16 init.d]# ip='10.1.1.1-$ip' 3 [root@ipv6-1-16 init.d]# echo $ip 4 10.1.1.1-$ip
3、双引号定义变量,此种方法特点:输出变量是引号内有变量会经过解析后输出变量内容, 而不是原样输出。此法实用于字符串中附带有变量内容的定义。
1 [root@ipv6-1-16 init.d]# ip=10.1.1.1 2 [root@ipv6-1-16 init.d]# ip="10.1.1.1-$ip" 3 [root@ipv6-1-16 init.d]# echo $ip 4 10.1.1.1-10.1.1.1
由上可以看出,无引号和双引号实现的功能基本类似,实现功能所差无几,但是实际中最好使用双引号来对含有变量变量的进行定义。
4、常用的把一个命令作为变量:
使用反引号。
1 [root@ipv6-1-16 home]# cmd=`ls -l` 2 [root@ipv6-1-16 home]# echo $cmd 3 total 8 drwx------. 5 tpl tpl 4096 Mar 16 02:34 tpl drwx------. 4 xguest xguest 4096 Jun 25 2015 xguest
三、特殊标量:
具体测试:
$0使用:
1 [root@localhost ~]# cat /server/script/echo.sh 2 #!/bin/sh 3 echo "hello!" 4 echo $0 5 [root@localhost ~]# sh /server/script/echo.sh 6 hello! 7 /server/script/echo.sh
$n使用:
1 以下是部分脚本: 2 以上内容省略 3 echo $1 4 [root@ipv6-1-15 script]# sh tomcatd.sh status 5 tomcat is running. [ OK ] 6 status
$*
1 [root@localhost script]# cat for.sh 2 for i in "$*";do echo $i;done 3 [root@localhost script]# sh for.sh "you are" right 4 you are right
$#
1 #!/bin/sh 2 . /etc/init.d/functions 3 function status(){ 4 if [ `ps -ef |grep java |grep -v grep|wc -l` -gt 0 ] 5 then 6 action "tomcat is running." /bin/true 7 else 8 action "tomcat is stopped." /bin/false 9 exit 5 10 fi 11 } 12 case $1 in 13 status) 14 status 15 ;; 16 17 *) 18 echo "USAG:start|stop|restart|status" 19 esac 20 echo $# 21 [root@ipv6-1-15 script]# sh $*.sh status 22 tomcat is running. [ OK ] 23 1 #表示一个参数
$@
1 [root@localhost script]# cat for.sh 2 for i in "$@";do echo $i;done 3 [root@localhost script]# sh for.sh "you are" right 4 you are 5 right
$$
1 [root@localhost script]# sh for.sh "you are" right 2 you are 3 right 4 [root@localhost script]# echo $$ 5 1561
$!
1 [root@localhost script]# sh for.sh asfasdf & 2 [1] 1672 3 [root@localhost script]# asfasdf 4 5 6 [1]+ Done sh for.sh asfasdf 7 [root@localhost script]# echo $! 8 1672
$?
1 [root@localhost script]# echo "hello" 2 hello 3 [root@localhost script]# echo $? 4 0
$_
1 [root@ipv6-1-15 script]# read a b c 2 3 [root@ipv6-1-15 script]# echo $_ 4 c