shell种类:Bourne Shell(sh); Bourne Again Shell(Bash); Korn Shell 93(ksh93); C Shell(csh); Tenex C Shell(tcsh)等
工作模式:
互动模式(interactive mode):由输入设备(键盘)键入命令,等待shell执行完该命令后才能执行下一条命令
shell Script模式(no-interactive mode):将要执行的命令写入文件(script)中交由Bash去读取与执行
Bash Shell的功能特性:
兼容Bourne Shell(sh)
支持许多选项及变量,可自定义Shell使用环境
支持历史命令(history)
具有命令列修订能力,可重新读取或修改之前执行过的命令
具有工作控制(job control)能力,可以控制前台或后台程序
具有程序设计的能力,支持变量.真假值判断.控制流程.函数.输入输出控制等
易于取得,文件小,免编译且执行效率高,可重复执行,不同的script可组合执行
Shell Script(形如filename.sh)基本格式:
#! /bin/bash -----shell声明
# -----注释
lines here -----内容
Shell Script编辑工具:vi或vim, nano, leafpad, ee(FreeBSd), Emacs, kwrite, gedit等
执行前需要赋予 .sh 文件执行权限:chmod +x filename.sh
注:.sh文件不是二进制文件,在执行之前系统需要读取文件的内容,故也需要"r" 权限
在不影响使用的情况下,考虑到安全因素不要给.sh文件赋予过多的权限
执行:
1. 文件所处目录下执行:./filename.sh (Script会在一个新开启的shell进程中执行,执行结束后新开启的进程关闭)
绝对路径执行 /path/to/filename.sh
2. source filename.sh 或 . /filename.sh [注意 . 与 / 之间的空格](Script在当前shell进程中执行)
3. bash filename.sh (使用此方法时可以不用设置文件的权限,Script会在一个新开启的shell进程中执行,执行结束后新开启的进程关闭)
4.添加到crontab中定期或定时执行(请自行参看相关文档说明)
附网上找到的一张shell执行过程图:(忘记出处,望图片作者见谅)
检查与排错:
bash -v filename.sh 检查语法
bash -n filename.sh 查看代码而不执行
bash -x filename.sh 追踪执行过程
查看当前用户使用的shell种类:echo $SHELL
更改用户使用的shell :
chsh ;修改自己所使用的shell
chsh USER:root用户修改USER使用的shell
在Windows平台上可以用Cygwin或MSYS来部署Bash Shell环境
通配符:
*: 代表任意个字符,可以为空
?: 代表一个字符,不能为空
转义字符:\ 也称做逃逸字符,用来使特殊字符(如 ' " * ? \ ~ ! # $ & ( ) < > / 等)回归单纯字符的用途
唯一例外:若在 \ 后方接换行字符(即按下Enter键),bash会把 \ 试做续行字符,用作将一条很长的命令分作多行
字符集合:
[] 括号中存放字符范围,如[abc]代表abc其中的一个字符,
[a-z]代表小写字母中的任一个字符
[!abc]代表除了abc以外
括号扩展:如{a,b,c}d 代表 ad, bd, cd 三个的组合
{1,2,3,4,5,6,7,8,9}\*{1,2,3,4,5,6,7,8,9}代表九九表,注意\转义作用及不能写成{1-9}
在Shell Script执行时,系统会默认开启3个标准文件:
标准输入stdin(代码 0 ):由标准输入(通常为键盘)读取数据,
标准输出stdout(代码 1):由标准输出(通常为监视器)显示执行结果,
标准错误stderr(代码 2):由标准错误(通常为监视器)显示错误信息,
输出重定向:将原本需要输出到屏幕的信息重新制定存到文件中
覆盖重定向:command或Script > file 若file文件不存在则创建,存在则清空内容后重新写入新内容
追加重定向:command或Script >> file 若file文件不存在则创建,存在则在文件末尾添加新内容
输入重定向:command或Script < file 将file的内容送给command或Script处理以代替键盘输入
输入输出重定向:command或Script < file1 > file2 将file1的内容送给command或Script处理后,将结果存放到file2中
管道:command1 | command2 将command1的输出作为command2的输入
强制变量必须要经过声明才能使用:shopt -s -o nounset [避免错打变量名称造成程序执行错误]
login shell:/etc/passwd 每行的最后一个字段[只有该字段的shell在/etc/shells文件中,该用户才可以访问主机]
父shell与子shell:在登录主机后,我们已经处在一个login shell中,称为父shell,当我们执行某个shell script时,父shell会根据script的第一行的#! /bin/ 中指定的shell开启新的shell(子shell),当子shell中script执行完毕后子shell关闭返回到父shell