一、Linux支持的SHELL
1、shell=命令解释器+脚本语言编程环境
shell是系统维护的重要工具,便于自动批量处理大量任务。
BNU BASH 1998年诞生, 兼容Bourne Shell(sh),2009年2月推出4.0,其官网为www.gnu.org/software/bash。
2、显示支持的shell(cat /etc/shells)
/bin/sh 已经被bash所取代
/bin/tcsh 整合C Shell,提供更多的功能
3、各种shell对比
Shell 类别 | 易学性 | 可移植性 | 编辑性 | 快捷性 |
Bourne (sh) | 容易 | 好 | 较差 | 较差 |
Korn (ksh) | 较难 | 较好 | 好 | 较好 |
Bourne Again (bash) | 难 | 较好 | 好 | 好 |
POSIX (psh) | 较难 | 好 | 好 | 较好 |
C (csh) | 较难 | 差 | 较好 | 较好 |
TC (tcsh) | 难 | 差 | 好 | 好 |
Z (zsh) | 难 | 差 | 好 | 好 |
4、不同脚本语言面向不同的任务,可能只用到其中一种或多种
通常学习shell做为脚本入门基础。 |
Perl比shell+sed+awk更强大。 |
TCL须专门学习TCL语法、功能相对强大;用的人比较少,代码比较复杂。 |
Expect是Unix系统中用来进行自动化控制和测试的软件工具,作为Tcl脚本语言的一个扩展,应用在交互式软件中如telnet,ftp,Passwd,fsck,rlogin,tip,ssh等。 |
Perl语言非常灵活,不易完全掌握;目前比较多人用,但代码公开性不强; |
Python语法简洁高效;须专门配置好运行环境;面向对象语言学习周期比较长; |
5、交互式script
一些脚本不需要来自用户的交互信息。非交互脚本的优势包括: 脚本每次都以可以预测的行为运行。 脚本可以在后台运行。 |
许多脚本在运行的时候给用户输出信息。交互脚本的优势在于: 可以建立更加灵活的脚本。 用户可自定义脚本使得其产生不同的行为。 脚本可以在运行过程中报告状态。 |
当编写交互脚本的时候,不要省略注释。用echo 和printf打印适当的信息的脚本能变的更加友好且更加容易调试。 一个脚本可能做一件完美的工作,但是如果脚本不通知用户正在进行的工作,你将会得到许多来自用户的帮助请求。所以请把告诉用户等待计算完成的输出的提示信息包含进脚本。如果可能的话,尝试提醒下用户需要等待多长的时间。如果再执行某个特定任务的时候等待通常要持续很长时间,你可能会考虑把一些关于脚本输出进度的指示一起集成到脚本当中去。 当提示用户进行输入的时候,同样对输入数据的类型最好给出更多的相关信息。同样在检查参数的时候也采取同样的使用方法信息。 |
二、GNU Bourne Again Shell的特点
1、可控制前台及后台运行
2、可定义许多选项及变量
shell标记 | set -f→ls /etc/*.conf——*失效 set +f→ls /etc/*.conf——*有效 |
shell选项 | shopt 内置命令;shopt –s 内置命令;shopt –u内置命令 shopt -s cdspell→cd /ect——开启语法纠正 shopt -s expand_aliases——l.等别名有效 shopt -s extglob——ls *.log中*或?有效 shopt -s nocaselob→ls install.LOG中大写也成功 |
3、可支持命令history功能;可重新修改之前执行过的命令
三、历史记录命令
1、Fc与history
history(默认显示全部) history 9 显示最后9个 history –d 9 删除第9个 history –c 为安全清history history –w 存入~/.bash_history history –r t.txt读~/.bash_history | fc –l 100 110 fc –l 9 显示>9的命令 fc –ln 不带行号显示 fc –lr 反序带行号 fc ssh 搜索ssh命令并编辑 fc –s ls 搜索并执行 |
2、历史指令扩展的用法
!3——调用第3个命令 !-3——调用倒数第3个命令 !ssh——搜并执行ssh命令 !!——调用上一个命令 !!:p——调用上一命令但不执行 date;!#——等价于date;date; | cd /tmp——!?tmp?等价于cd /tmp ls /tmp/home——cd !!:$等价于cd /home ls /tmp/home——!ls :1等价于ls /tmp ls /var/www/index.php——!!:h等价ls /var/www ls /var/www/index.php——!!:$等价ls index.php |
3、可定义许变量(以history为例)
set|grep –i history
HISTFILE=/root/.bash_history
HISTSIZE=1000——/etc/profile中定义~/.bash_history的大小
HISTFILESIZE=1000
SHELLOPTS=braceexpand:emacs:hashall:histextend:history:interactive-comment:monitor
HISTSIZE=1000 /etc/profile:HISTSIZE=100 source /etc/profile或. /etc/profile echo $HISTSIZE |
histextend——历史指令扩展???????????? 调用历史指令更方便快速;调用先前的指令并安插参数;快速修正之前错误的命令。 Shopt –s history——历史指令扩展立即执行 Shopt -u history——历名指令扩展不立即执行 |
set +o history——关闭历史指令功能 Set –o history——打开历史指令的功能 |
export HISTCONTROL=ignoreboth|ignorespace|ignoredups Ignorespace——开头的空格不存入脚本 Ignoredups——连续重复的指令只存一个 Ignoreboth——结构以上历史功能 |
export HISTIGNORE=ls:t*:\&——不存入历史脚本中的命令 T*——t打头的文件 &——连续重复的指令只存入一个 |
四、常用帮助
whatis passwd +#man [5|k|a] passwd |
ls --help——用法或简短的语法总结。 |
info ls比man更详细。可用易用的pinfo浏览info page,可用箭头在链接间移动。 |
man page通常提供参考信息,并不提供指导或一般使用。 |
/usr/share/doc:未被编入man page或info page中的新产品的文档。 |
五、Built-in Command List
# echo $0 $$ 进程名、PID
bash 5725
: | 空,永远返回为空 :> list.txt |
. | 从当前shell中执行操作 |
break | 退出for,while,until,case语句 |
cd | 改变当前目录 |
continue | 执行循环的下一步 |
echo | 反馈信息到标准输出 |
eval | 读取参数,执行结果命令 |
exec | 执行命令,但不在当前shell |
exit | 退出当前shell |
export | 导出变量,使当前shell可利用它 |
pwd | 显示当前目录 |
read | 从标准输入读取一行文本 |
命令 | 命令解释 |
readonly | 设置变量为只读 |
return | 退出函数并带有返回值 |
set | 控制各种参数到标准输出的显示 |
shift | 命令行参数向左偏移一个 |
test | 条件测试 |
times | 显示用户脚本或任何系统命令的运行时间,第一行给出shell消耗时间,第二行给出运行命令消耗的时间 |
trap | 当捕获信号时运行指定命令 |
ulimit | 显示或设置shell资源 |
umask | 显示或设置缺省文件创建模式 |
unset | 从shell内存中删除变量或函数 |
wait | 等待直到子进程运行完毕,报告终止 |
type | 查询命令是否驻留系统以及该命令的类型 |
运行多个命令: cd /etc;ls cd /etc&&ls cd /etc||ls (cd /etc;ls) {cd /etc/X11;ls} |
六、date
# date '+%a ';; 星期几的缩写(Sun) | %A 星期几的完整写法(Sunday) |
%b 月名的缩写(Oct) | %B 月名的完整写法(October) |
# date '+%h ';; Month abbreviation | # date '+%H ';; 24小时格式的小时 |
# date '+%d ';; 十进制日期 | # date '+%D ';; # MM/DD/YY |
%e 日期,如果只有一位会补上一个空格 | %Z 时区(PDT) |
%I 用十进制表示12小时格式的小时 | # date '+%j ';; 一年中的第几天 |
# date '+%m ' 十进制表示的月份 | # date '+%M ' 十进制表示的分钟 |
%p 12小时表示法(AM/PM) | # date '+%S ';; 十进制Second |
# date '+%s ';; 1970/01/01 second | # date '+%r ';; # AM-PM time |
# date '+%w ';; 十进制星期几(sun是0) | %W 一年中的第几个星期(周一为第一天) |
%x 重新设置本地日期(08/20/99) | %X 重新设置本地时间(12:00:00) |
# date '+%y ';; 两位数字表示的年(99) | %Y 四位数字表示的年 |
# date +'%F %T' 2012-06-23 12:53:07 | # date +'%z-%Y-%M-%d %H:%M:%S' +0800-2012-06-23 12:06:34 |
# date +'%H:%M:%S' 13-06-49 | # date +'%T' 21:20:08 |
date -d "last sunday" +%Y-%m-%d //上一星期天的日期
date 062421172012 //MMddHHMMYYYY
date -s 04/10/2002 //设定时间
date -s 02:02:00 //设定日期
七、ls -F
无标识代表一般文件 | ls -F|grep -v \*$|grep -v \@$|grep -v \=$|grep -v \|$|grep -v \/$ ls –F|egrep -v ’\*$|\@$|\=$|\|$|\/$’ |
*代表可执行文件 | ls -F /bin/bash*|grep \*$ |
@代表soft link | ls -F /bin/sh@|grep \@$ |
=代表socket文件 | ls -F /dev/log|grep \=$ |
|代表pipe文件 | ls -F /dev|grep \|$ |
八、lsof命令的使用案例
lsof 列出所有打开的文件 lsof | grep ‘filename’ 查看谁正在使用某个文件 |
lsof -c http或lsof | grep mysql 列出某个程序所打开的文件信息 lsof -c mysql -c apache 列出多个程序多打开的文件信息 |
lsof -u username 列出某个用户打开的文件信息 lsof -g 5555 某个用户组所打开的文件信息 lsof -u test -c mysql 列出某个用户以及某个程序所打开的文件信息 lsof -u ^root 列出除了某个用户外的被打开的文件信息 |
lsof -p 1 通过某个进程号显示该进行打开的文件 lsof -p 123,456,789列出多个进程号对应的文件信息 lsof -p ^1列出除了某个进程号,其他进程号所打开的文件信息 |
lsof –i列出所有的网络连接 lsof -i tcp 列出所有tcp网络连接信息 lsof -i udp列出所有udp网络连接信息 lsof -i :3306列出谁在使用某个端口 lsof -i udp:55列出谁在使用某个特定的udp端口 lsof -i tcp:80特定的tcp端口 lsof -a -u test –i列出某个用户的所有活跃的网络端口 |