1,什么是shell
Shell又称命令解释器,它能识别用户输入的各种命令,并传递给操作系统。它的作用类似于Windows操作系统中的命令行,但是,Shell的功能远比命令行强大的多。在UNIX或者localhost中,Shell既是用户交互的界面,也是控制系统的脚本语言。
2,如何查看当前系统支持的shell?
cat /etc/shells
3,如何查看当前系统默认shell?
echo $SHELL
4,作为程序设计语言的shell
Shell不仅仅是充当用户与UNIX或者localhost交互界面的角色,还可以作为一种程序设计语言来使用。通过Shell编程,可以实现许多非常实用的功能,提高系统管理的自动化水平。本节将介绍作为程序设计语言的Shell的一些特性。
shell脚本
如果有一系列经常需要使用的命令,把它存储在一个文件里,shell可以读取这个文件并顺序执行其中的命令,这样的文件就叫shell脚本。shell脚本按行解释。
5,什么是驼峰语法?
骆驼式命名法就是当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始;从第二个单词开始以后的每个单词的首字母都采用大写字母,例如:myFirstName、myLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。
除了驼峰命名法,另外还有匈牙利命名法。基本原则是:变量名=属性+类型+对象描述。匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。比如m_lpszStr, 表示指向一个以0字符结尾的字符串的长指针成员变量。
另外,有些程序员喜欢用下划线。比如file_name.
6,shell脚本的基本元素
第1行的“#!/bin/bash”。
注释:说明某些代码的功能。
可执行语句:实现程序的功能。
7,注释
单行注释:表示方法是一个井号“#”,从该符号开始一直到行尾都属于注释的内
容。
# ...... 注释内容
多行注释:最简单的方法就是使用冒号“:”配合here document,语法如下:
:<<BLOCK
....注释内容
BLOCK
8,脚本编写规范
(1)开头指定脚本解释器
#!/bin/sh或#!/bin/bash
其他行#表示注释
名称见名知义 backup_mysql.sh,以sh结尾
(2)开头加版本版权等信息
Date:创建日期
Author:作者
Mail:联系方式
Function:功能
Version:版本
(3)脚本中尽量不用中文注释
别吝啬添加注释,必要的注释方便自己别人理解脚本逻辑和功能;
尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰;
单行注释,可以放在代码行的尾部或代码行的上部;
多行注释,用于注解复杂的功能说明,可以放在程序体中,也可以放在代码块的开始部分 代码修改时,对修改的内容
(4)多使用内部命令;内部命令可以在性能方面为你节省很多。
echo、eval、exec、export、read、shift、exit
echo
是用于终端打印的基本命令,默认情况下,echo 在每次调用后会添加一个换行符
eval
命令格式:eval args
功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行。
exec
命令能够在不创建新的子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后,该进程就终止了。
export
设置或者显示环境变量
read
命令可从标准输入读取字符串等信息,传给shell程序内部定义的变量。
-p prompt:设置提示信息
-t timeout:设置输入等待时间,单位默认为秒
shift
在程序中每使用一次shift语句,都会使所有的位置参数依次向左移动一个位置,并使位置参数$#减1,直到减到0为止。
exit
退出shell程序。在exit之后可以有选择地指定一个数作为返回状态
(5)没有必要使用cat命令
(6)代码缩进
(7)仔细阅读出错信息
有时候我们修改了某个错误并再次运行后,系统依旧会报错。然后我们再次修改,但系统再次报错。
这可能会持续很长时间。但实际上,旧的错误可能已经被纠正,只是由于出现了其它一些新错误才导致
系统再次报错
(8)脚本以.sh为扩展名
9,快速生成脚本开头的版本版权注释信息
[root@localhost ~]# vim ~/.vimrc
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"#########################")
call setline(3,"#File name:".expand("%"))
call setline(4,"#Version:v1.0")
call setline(5,"#Email:admin@test.com")
call setline(6,"#Created time:".strftime("%F %T"))
call setline(7,"#Description:")
call setline(8,"#########################")
call setline(9,"")
endif
endfunc
10,执行方式
1)交互式执行
2)作为文件程序执行
11,执行脚本的方法
(1)bash ./filename.sh(产生子进程,再运行,使用当前指定的bash shell去运行)
(2)./filename.sh(产生子进程,再运行,使用脚本里面指定的shell去运行。使用该种方式执行需要x权限)
(3)source ./filename.sh(source命令是一个shell内部命令,其功能是读取指定的shell程序文件,并且依次执行其中的所有的语句,并没有创建新的子shell进程,所以脚本里面所有创建的变量都会保存到当前的shell里面)
(4). filename.sh(和source一样,也是使用当前进程执行)
12,shell脚本的退出状态
在UNIX或者Linux中,每个命令都会返回一个退出状态码。退出状态码是一个整数,其有效范围为0~255。通常情况下,成功的命令返回0,而不成功的命令返回非0值。非0值通常都被解释成一个错误码。行为良好的UNIX命令,程序和工具都会返回0作为退出码来表示成功。
Shell脚本中的函数和脚本本身也会返回退出状态码。在脚本或者是脚本函数中执行的最后的命令会决定退出状态码。另外,用户也可以在脚本中使用exit语句将指定的退出状态码传递给Shell。