简介

shell是一个命令解释器

适合用于处理纯文本类型的数据

shell脚本语言是弱类型语言(无须定义变量的类型即可使用)

Unix/linux中主要有两大类shellBourne shellC 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

#!为幻数,内核会根据“#!”来确定该用哪个程序解释这个脚本中的内容

这一行必须位于每个脚本顶端的第一行,如果不是第一行则为脚本注释

2bashsh       区别

大多数情况下,脚本开头的#! /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脚本的执行通常的几种方式

1bash script-namesh script-name(没有执行权限也行,推荐此方法)

2path/ script-name./ script-name:指在当前路径下执行脚本,需要执行权限

3source script-name. script-name(也可以不需要执行权限)

使用此方法可以将sun.sh自身脚本中的变量值或函数等的返回值传递到当前父shell脚本father.sh中使用

4sh< script-namecat 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中依然存在,而shbash执行脚本都会启动新的子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、脚本中的单引号、双引号及反引号必须为英文状态下的符号