shell脚本由基础变量及特殊变量($@、$*、$#等)到实战。
一、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输出的 值是多少呢?以下是测试情况。
[root@ipv6-- init.d]# ip=10.1.1.1
[root@ipv6-- init.d]# ip=10.1.1.1-$ip
[root@ipv6-- init.d]# echo $ip
10.1.1.1-10.1.1.1
2、通过单引号来定义变量,此种方式特点是:输出变量是单引号中是什么就输出什么,即使 引号中的内容有变量也会直接把变量原样输出。此法为定义纯字符串变量。
[root@ipv6-- init.d]# ip=10.1.1.1
[root@ipv6-- init.d]# ip='10.1.1.1-$ip'
[root@ipv6-- init.d]# echo $ip
10.1.1.1-$ip
3、双引号定义变量,此种方法特点:输出变量是引号内有变量会经过解析后输出变量内容, 而不是原样输出。此法实用于字符串中附带有变量内容的定义。
[root@ipv6-- init.d]# ip=10.1.1.1
[root@ipv6-- init.d]# ip="10.1.1.1-$ip"
[root@ipv6-- init.d]# echo $ip
10.1.1.1-10.1.1.1
由上可以看出,无引号和双引号实现的功能基本类似,实现功能所差无几,但是实际中最好使用双引号来对含有变量变量的进行定义。
4、常用的把一个命令作为变量:
使用反引号。
[root@ipv6-- home]# cmd=`ls -l`
[root@ipv6-- home]# echo $cmd
total drwx------. tpl tpl Mar : tpl drwx------. xguest xguest Jun xguest
三、特殊标量:
具体测试:
$0使用:
[root@localhost ~]# cat /server/script/echo.sh
#!/bin/sh
echo "hello!"
echo $
[root@localhost ~]# sh /server/script/echo.sh
hello!
/server/script/echo.sh
$0
$n使用:
以下是部分脚本:
以上内容省略
echo $
[root@ipv6-- script]# sh tomcatd.sh status
tomcat is running. [ OK ]
status
$*
[root@localhost script]# cat for.sh
for i in "$*";do echo $i;done
[root@localhost script]# sh for.sh "you are" right
you are right
$#
#!/bin/sh
. /etc/init.d/functions
function status(){
if [ `ps -ef |grep java |grep -v grep|wc -l` -gt ]
then
action "tomcat is running." /bin/true
else
action "tomcat is stopped." /bin/false
exit
fi
}
case $ in
status)
status
;; *)
echo "USAG:start|stop|restart|status"
esac
echo $#
[root@ipv6-- script]# sh $*.sh status
tomcat is running. [ OK ]
#表示一个参数
$@
[root@localhost script]# cat for.sh
for i in "$@";do echo $i;done
[root@localhost script]# sh for.sh "you are" right
you are
right
$$
[root@localhost script]# sh for.sh "you are" right
you are
right
[root@localhost script]# echo $$
$!
[root@localhost script]# sh for.sh asfasdf &
[]
[root@localhost script]# asfasdf []+ Done sh for.sh asfasdf
[root@localhost script]# echo $!
$?
[root@localhost script]# echo "hello"
hello
[root@localhost script]# echo $?
$_
[root@ipv6-- script]# read a b c [root@ipv6-- script]# echo $_
c
随机推荐
- IPFS中文简介
ipfs是什么? 它是一个协议也是一个网络,已经运行了2年半,并非虚无缥缈的空气. 它像比特币网络一样,并没有发明什么新技术,他只是将很多种技术(P2P网络技术,bt传输技术,Git版本控制,自证明文 ...
- DGA域名——可以每天只生成一个域名,因此最多存在365个 DGA域名;
Mirai变种中的DGA 分享到: 发布时间:2016-12-12 16:02:57 作者:360网络安全研究院 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 那个导致美国断网 ...
- Spring MVC 和 Struts2 的区别?
1.请求拦截级别 struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入 struts2实际上是通过setter ge ...
- 本机连接调试Erlang结点与rebar3编译
今天需要实时查看目标结点上的相关信息,于是查阅了关于远程Shell使用的资料,最终采用JCL的方式与本机上的erlang结点交互.在使用erl shell时需要指定目标结点的cookie以及当前结点名 ...
- UVA-12293(组合游戏)
题意: 有两个相同的盒子,一个盒子里面有n个球,另一个盒子里面有1个球,每次清空球较少的那个盒子,然后从另外的一个盒子里拿到空盒子里使得操作后两个盒子至少有一个球,判断是先手还是后者胜; 思路: 跟每 ...
- 机器学习 : 高斯混合模型及EM算法
Mixtures of Gaussian 这一讲,我们讨论利用EM (Expectation-Maximization)做概率密度的估计.假设我们有一组训练样本x(1),x(2),...x(m),因为 ...
- BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt
BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt Description www.lydsy.com/JudgeOnline/upload/noi2018day2.pdf 每次用 ...
- 解决最近windows版本Node.js中npm出现的“Error: ENOENT, stat 'C:\Users\UserName\AppData\Roaming\npm”的问题
(转载请注明出处,from www.cnblogs.com/xdxer) 问题可能如下所示 解决方案: 在 'C:\Users\UserName\AppData\Roaming\‘ 下手动的增加一个文 ...
- keil5中文乱码的解决
keil5 复制出来的中文显示乱码,该如何解决? 点击Edit - Configuration ,进入编辑器设置: 点击ok ,就可以了
- UltraISO中文版+注册码
UltraISO v9.5.3.2901 百度网盘下载地址: http://pan.baidu.com/s/1l9t2U 新浪微盘下载地址: http://vdisk.weibo.com/s/rcvB ...