UNIT01 Shell Introduction

一、Linux支持的SHELL

1shell=命令解释器+脚本语言编程环境

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功能;可重新修改之前执行过的命令

三、历史记录命令

1Fchistory

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 httplsof | 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列出某个用户的所有活跃的网络端口

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值