目录
shell基本知识
1,为什么学习和使用Shell编程
2, shell的起源
3,shell的功能
4,shell的分类
5, shell脚本的基本元素
6, shell脚本编写规范
7,shell脚本的执行方式
8, 执行脚本的方法
9,shell脚本的退出状态
shell基本知识
shell: 壳子
1,为什么学习和使用Shell编程
对于一个合格的系统管理员来说,学习和掌握Shell编程是非常重要的。通过编程,可以在很大程度 上简化日常的维护工作,使得管理员从简单的重复劳动中解脱出来。
shell程序的特点:
1、简单易学
2、解释性语言,不需要编译即可执行
2, shell的起源
(1)1964年,美国AT&T公司的贝尔实验室、麻省理工学院及美国通用电气公司共同参与开始
研发一套 可以安装在大型主机上的多用户、多任务的操作系统,该操作系统的名称Multics。
(2)1970年,丹尼斯•里奇和汤普逊启动了另外一个新的多用户、多任务的操作系统的项目,
他们把这 个项目称之为UNICS。
(3)1973年,使用C语言重新编写了Unix。通过这次编写,使得Unix得以移植到其他的小型机
上面。
(4)1979年,第一个重要的标准UNIX Shell在Unix的第7版中推出,并以作者史蒂夫•伯
恩(Stephen Bourne)的名字命名,叫做Bourne Shell,简称为sh。
(5) 20世纪70年代末,C Shell作为2BSD UNIX的一部分发布,简称csh。
(6)之后又出现了许多其他的Shell程序,主要包括Tenex C Shell(tcsh)、Korn Shell(ksh)
以及 GNU Bourne-Again shell(bash)。
3,shell的功能
Shell又称命令解释器,它能识别用户输入的各种命令,并传递给操作系统。它的作用类似于 Windows操作系统中的命令行,但是,Shell的功能远比命令行强大的多。在UNIX或者localhost中, Shell既是用户交互的界面,也是控制系统的脚本语言。
4,shell的分类
(1)Bourne Shell:标识为sh,该Shell由Steve Bourne在贝尔实验室时编写。在许多Unix系
统中,该 Shell是root用户的默认的Shell。
(2) Bourne-Again Shell:标识为bash,该Shell由Brian Fox在1987年编写,是绝大多
数localhost发行 版的默认的Shell。
(3) Korn Shell:标识为ksh,该Shell由贝尔实验室的David Korn在二十世纪八十年代早期
编写。它完 全向上兼容 Bourne Shell 并包含了C Shell 的很多特性。
(4)C Shell:标识为csh,该Shell由Bill Joy在BSD系统上开发。由于其语法类似于C语言,因
此称为C Shell
如何查看当前系统支持的shell
[root@localhost ~]# cat /etc/shells
如何查看当前系统默认shell?
[root@localhost ~]# echo $SHELL
什么是驼峰语法?
骆驼式命名法就是当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时,第 一个单词以小写字母开始;从第二个单词开始以后的每个单词的首字母都采用大写字母,例如: myFirstName、myLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。
getsomething -> getSomething
getsomething -> get_something
5, shell脚本的基本元素
对于一个基本的Shell程序来说,应该拥有以下基本元素:
1.声明:声明用哪个命令解释器来解释并执行当前脚本文件中的语句,一般写的解释器为 #!/bin/bash 。
2.命令:可执行语句,实现程序的功能。
3.注释:说明某些代码的功能,通过在代码中增加注释可以提高程序的可读性。
(1)单行注释:#开头的一整行都是注释,
例如: #comment1
#comment2
#comment3 ……
(2)多行注释,使用冒号“:”配合here document可实现多行注释,
例如:
:<<BLOCK(可以是任意的字符)
……注释内容
BLOCK
4.赋予rx的权限
#!/bin/bash 或者 #!/bin/sh
写命令或者shell中语句(变量定义,if-else, for, while)
注释:单行注释和多行注释
单行:#
多行数值: -》 :<<BLOCK(可以是任意的字符) 注释的开始
BLOCK 注释的结束
小练习:
编写脚本并执行
(1)创建目录shell_code23
[root@wangjingjing ~]# mkdir shell_code23
[root@wangjingjing ~]# cd shell_code23
(2)创建目录0130
[root@wangjingjing shell_code23]# mkdir 0130
[root@wangjingjing shell_code23]# cd 0130/
(3)创建文件first_script.sh
[root@wangjingjing 0130]# vim first_scripts.sh
(4)编辑文件,并保存退出
#!/bin/bash
#祝大家新年好
echo "Happy New Year"
:<<annotation
多行注释
annotation
(5)给文件加执行权限
(6)执行文件:
[root@wangjingjing 0130]# bash first_scripts.sh
Happy New Year
6, shell脚本编写规范
(1)脚本文件名应见名知意,例如backup_mysql.sh
(2)文件开头指定脚本解释器 #!/bin/sh 或 #!/bin/bash
(3)开头加版本特权等信息
# Date:创建日期
# Author:作者
# Mail:联系方式
# Function:功能
# Version:版本
(4)脚本中尽量不要用中文注释 别吝啬添加注释,必要的注释方便自己别人理解脚本逻辑和功能; 尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰; 单行注释,可以放在代码行的尾部或代码行的上部; 多行注释,用于注解复杂的功能说明,可以放在程序体中,也可以放在代码块的开始部分。
(5)多使用内部命令 常用的内部命令有:echo、eval、exec、export、read、shift、exit
echo
echo可在屏幕上输出信息
-n 不换行输出内容
-e 解析转义字符
\n 换行
\r 回车
\t 制表符
\b 退格
\v 纵向制表符
eval
命令格式:eval args
功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行。
exec
(1)exec命令能够在不创建新的子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后,该进程就终止了。
(2)export设置或者显示环境变量
(3)read命令可从标准输入读取字符串等信息,传给shell程序内部定义的变量。
-p prompt:设置提示信息
-t timeout:设置输入等待时间,单位默认为秒 (超时后停止)
shift
shift,在程序中每使用一次shift语句,都会使所有的位置参数依次向左移动一个位置,
并使位置参 数$#减1,直到减到0为止。
[root@wangjingjing ~]# vim arg_script.sh
exit
exit,退出shell程序。在exit之后可以有选择地指定一个数作为返回状态
[root@wangjingjing ~]# vim exit_script.sh
查看退出状态码(此处指定退出状态码)
(6)没有必要使用cat命令
eg:cat /etc/passwd | grep guru
使用以下方式即可
eg:grep guru /etc/passwd
(7)代码缩进 4个字符
缩进用4个字符
针对当个用户vim配置文件应该放在~/.vimrc
针对所有用户的vim配置应该放在/etc/vimrc
打开~/.vimrc文件,配置并保存退出
[root@wangjingjing ~]# 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
autocmd FileType sh setlocal ai ts=4 sw=4 et
新建一个newfile.sh文件
(8)仔细阅读出错信息 有时候我们修改了某个错误并再次运行后,系统依旧会报错。然后我们再次修改,但系统再次报 错。这可能会持续很长时间。但实际上,旧的错误可能已经被纠正,只是由于出现了其它一些新错误才 导致系统再次报错。
7,shell脚本的执行方式
(1)交互式执行 不能永久保存代码
方法一:
[root@wangjingjing 0130]# for i in `seq 6`
> do 开始
> echo $i 打印
> done 结束
1
2
3
4
5
6
方法二:
(2)作为程序文件执行(常用)
对于一组需要经常重复执行的Shell语句来说,将它们保存在一个文件中来执行。我们通常称这种包 含多个Shell语句的文件为Shell脚本,或者Shell脚本文件。脚本文件是普通的文本文件,可使用任何的 文本编辑器查看或修改Shell脚本。
8, 执行脚本的方法
(1)bash ./filename.sh(产生子进程,再运行,使用当前指定的bash shell去运行)
不需要权限,可以直接执行文件
(2)./filename.sh(产生子进程,再运行,使用脚本里面指定的shell去运行。使用该
种方式执行需要x 权限)
没有加权限时执行文件
[root@wangjingjing 0130]# ./first_scripts.sh
bash: ./first_scripts.sh: Permission denied
添加x权限执行文件
[root@wangjingjing 0130]# chmod +x first_scripts.sh
[root@wangjingjing 0130]# ls -l
[root@wangjingjing 0130]# ./first_scripts.sh
脚本类型为bash
脚本类型为sh
(3)source ./filename.sh(source命令是一个shell内部命令,其功能是读取指定
的shell程序文件,并 且依次执行其中的所有的语句,并没有创建新的子shell
进程,所以脚本里面所有创建的变量都会保存到 当前的shell里面,不需要权限)
没权限时执行文件
[root@wangjingjing 0130]# chmod -x first_scripts.sh
[root@wangjingjing 0130]# ls -l
total 4
-rw-r--r--. 1 root root 102 Jan 30 19:47 first_scripts.sh
[root@wangjingjing 0130]# source first_scripts.sh
Happy New Year
(4). filename.sh(和source一样,也是使用当前进程执行)
练习:
data=1: 当前的连接上去定义的即-bash这个进程上定义的
如果在shell脚本的执行方式上:
get_data.sh
echo "$data"
bash get_data.sh
./get_data.sh
source get_data.sh
. get_data.sh
答案:
1,2产生新的子进程,拿不到data的值
3,4不产生子进程,可以拿到data的值
9,shell脚本的退出状态
在UNIX或者Linux中,每个命令都会返回一个退出状态码。退出状态码是一个整数,其有效范围为 0~255。通常情况下,成功的命令返回0,而不成功的命令返回非0值。非0值通常都被解释成一个错误 码。行为良好的UNIX命令,程序和工具都会返回0作为退出码来表示成功。
Shell脚本中的函数和脚本本身也会返回退出状态码。在脚本或者是脚本函数中执行的最后的命令会决定 退出状态码。另外,用户也可以在脚本中使用exit语句将指定的退出状态码传递给Shell。
退出状态码如何取获取:echo $?
成功 0
终止
失败