简介
shell是一个命令解释器
适合用于处理纯文本类型的数据
shell脚本语言是弱类型语言(无须定义变量的类型即可使用)
Unix/linux中主要有两大类shell:Bourne shell、C shell
[root@wangxian ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin
其他常用的脚本语言种类
PHP:更专注于web页面开发
python:优势在于开发较负载的运维工具软件、web界面的管理工具和web业务的开发等
perl:比shell脚本语言强大很多,语法灵活、复杂,缺点是不易读、团队协作难
查看操作系统的shell
[root@wangxian ~]# echo $SHELL /bin/bash [root@wangxian ~]# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash
shell脚本的建立和执行
shell脚本的建立
1、规范的脚本会在第一行指出由哪个程序(解释器)来执行脚本中的内容
#! /bin/bash
#!为幻数,内核会根据“#!”来确定该用哪个程序解释这个脚本中的内容
这一行必须位于每个脚本顶端的第一行,如果不是第一行则为脚本注释
2、bash与sh的 区别
大多数情况下,脚本开头的#! /bin/bash和#! /bin/sh没有区别,规范的写法开头使用#! /bin/bash。
如果使用/bin/sh执行时出现问题,再用bash试下,一般不会出现此问题
bash的版本、测试以及升级
[root@wangxian ~]# bash --version GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. [root@wangxian ~]# env x='() { :;}; echo be careful' bash -c "echo this is a test" this is a test
yum –y update bash
PS:如果测试没有提示be careful,则不需要升级
centos默认的shell均为bash
shell脚本的执行
当shell脚本运行时,它会先查找系统环境变量ENV,该变量指定了环境文件(加载顺序通常是/etc/profile、~/.bash_profile、~/.bashrc、/etc/bashrc等),然后开始执行脚本中的内容
shell脚本的执行通常的几种方式
1、bash script-name或sh script-name(没有执行权限也行,推荐此方法)
2、path/ script-name或./ script-name:指在当前路径下执行脚本,需要执行权限
3、source script-name或. script-name(也可以不需要执行权限)
使用此方法可以将sun.sh自身脚本中的变量值或函数等的返回值传递到当前父shell脚本father.sh中使用
4、sh< script-name或cat script-name|sh
第三种方法与其他方法不同的例子:
[root@wangxian ~]# echo 'userdir=`pwd`' >testsource.sh [root@wangxian ~]# cat testsource.sh userdir=`pwd` [root@wangxian ~]# sh testsource.sh [root@wangxian ~]# echo $userdir [root@wangxian ~]# source testsource.sh [root@wangxian ~]# echo $userdir /root [root@wangxian ~]#
结论:通过source或‘.’加载执行过的脚本,由于是在当前shell中执行脚本,因此在脚本结束之后,脚本中的变量(包括函数)值在当前shell中依然存在,而sh和bash执行脚本都会启动新的子shell执行,执行完后退回到父shell,因此变量值等无法保留。
shell脚本开发的基本规范及习惯
1、第一行指定解释器
2、脚本开头会加版本、版权、脚本的功能等信息
3、尽量不使用中文,如果要使用,调整字符集,export LANG=”zh_CN.UTF-8”
4、脚本命名 .sh扩展名
5、脚本应放在固定的路径下
脚本代码书写习惯:
1、成对的符号应尽量一次性写出来{} [] ‘’ “” ``
2、中括号[]两端至少要有1个空格
3、对于流程控制语句,应一次性将格式写完,再添加内容
一次性完成if语句的格式,应为:
if 条件内容
then
内容
fi
一次性完成for循环语句的格式,应为:
for
do
内容
done
4、通过缩进让代码更易读
5、对于常规变量的字符串定义变量值应加双引号,并且等号前后不能有空格
需要强引用的(指所见即所得的字符引用),则用单引号(''),如果是命令的引用,则用反引号。
6、脚本中的单引号、双引号及反引号必须为英文状态下的符号