篇一:《UnixShell实例精解》-学习笔记
《Unix Shell 实例精解》学习笔记
By Turner
第一章 关于UNIX Shell的介绍
1. 定义
shell 是一种特殊的程序,被用作用户与内核(kernel)的UNIX操作系统核心 通讯。常见的shell有C shell、B shell 和 Korn shell(B shell的超集)。 2. shell 主要功能
● 解释交互运行时,在命令行提示下敲入的命令
● 制订用户环境,通常在shell初始化文件中作这种工作。例如:设置终端键及窗口特征;设置搜索路径、权限、提示等
● shell 可以用作解释编程语言。Shell程序也叫命令表,由再文件中列出的命令组成。 3. 主要shell命令:
who mv rm wc ls cat date at
lpr rsh more awk pwd bc vi finger w pg find cc cp dd grep ksh sh ps sed cal lp
第2章 UNIX工具箱
1.正则表达式
一个正则表达式就是用来在一次搜索中匹配相同字符的一个字符模式。在大 多数程序中,把一个正则表达式封装在正斜杠(/)里。 2.正则表达式元字符
表(2.1)
3.举例
查找文件中的含有love的词:% vi picnic
I had a lovely time on our little picnic. Lovers were all around us, oh love :/love/
4.组合正则表达式元字符
文件内容:(数字是行号,竖线标明行的左右边界,不属于文件内容。这个文件我写在shell/exam/exam_2.9中)
1 |Christian Scott lives here and will put on a Christmas party.| 2 |There are around 30 to 35 people invited.| 3 |They are: | 4 | Tom| 5 |Dan|
6 | Rhonda Savage| 7 |Nicky and Kimerly.|
8 |Steve, Suzanne, Ginger and Larry.| 组合举例: /^[A-Z]..$/
搜索行以A至Z的一个字母开头,然后跟两个任意字母,然后跟一个换行符的行。将找到第5行。 /^[A-Z][a-z]*3[0-5]/
搜索以一个大写字母开头,后跟0个或多个小写字母,再跟数字3,再跟0—5之间的一个数字。 *[A-Z][a-z][a-z]$/
搜索以0个或多个空格开头,跟一个大写字母,两个小写字母和一个换车符。将找到第4行的TOM(整行匹配)和第5行。注意,*前面有一个空格。 /^[A-Za-z]*[^,][A-Za-z]*$/
将查找以0个或多个大写或小写字母开头,不跟逗号,然后跟0个或多个大写或小写字母,然后跟一个换车符。将找到第5行。书中解释有误。 5.更多的正则表达式元字符
这里讨论的元字符不一定可以移植到所有的正则表达式中,但一般可以用在vi、sed和grep中。 % vi textfile
----------------------------------------------------------------------- Patty won fourth place in the 50 yard dash square and fair. Occurences like this are rare.
Haha, what you want is just fourth. ~ ~
:/\<fourth\>/ 将查找词fourth
第3章 grep家族
1.grep的含义是“全局搜索正则表达式(RE)并打印该行” 2.grep支持的正则表达式
与在文件中搜索基本一样。可以参考表2.1。 3.grep 的选项
表3.1
4.grep命令的退出状态
如果grep操作成功,则状态是0,如果模式没找到,状态是1,如果文件没 找到,状态是2。如果操作被取消,则状态是130。查看状态的方法:在csh 中用echo $status。在sh和ksh中用echo $? 。例如 $ echo $? 0
5.带正则表达式的grep举例:
用于这些例子的文件叫datafile,位于chap03目录。内容如下: northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23 southwest SW Lewis Dalsass 2.7 .8 2 18 southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17 eastern EA TB Savage 4.4 .84 5 20 northeast NE AM Main Jr. 5.1 .94 3 13 north NO Margot Weber 4.5 .89 5 9 central CT Ann Stephens 5.7 .94 5 13 1) grep NW datafile
解释:打印datafile中包含NW的行 2) grep NW d*
解释:打印所有以d开头的文件中含有NW的文件。 3) grep '^n' datafile
解释:打印文件datafile中所有以字母n开头的行 4) grep TB Savage datafile
解释:在Savage和datafile文件中查找有TB的行 5) grep 'TB Savage' datafile
解释:在datafile文件中查找含有TB Savage的行并打印。这个例子在书中有误。 6) grep '^[we]' datafile
打印datafile中以w或者e开头的行 7) grep 'ss* ' datafile
northwest NW Charles Main 3.0 .98 3 34 southwest SW Lewis Dalsass 2.7 .8 2 18
解释:打印所有包含一个s并跟0个或者多个s,然后跟一个空格的行 6.用管道的grep
grep 可以从管道得到输入。 % ls –l
drwxr-xr-x 6 oracle dba 512 4月 3 21:49 chap10 drwxr-xr-x 2 oracle dba 512 4月 10 22:23 exam -rwxr--r-- 1 oracle dba 1842 4月 3 21:51 readme.txt
-rwxr--r-- 1 oracle dba 1801 4月 3 21:51 unix_readme.txt % ls –l | grep '^d'
drwxr-xr-x 6 oracle dba 512 4月 3 21:49 chap10 drwxr-xr-x 2 oracle dba 512 4月 10 22:23 exam % ls -l |grep '^[^d]'
-rwxr--r-- 1 oracle dba 1842 4月 3 21:51 readme.txt
-rwxr--r-- 1 oracle dba 1801 4月 3 21:51 unix_readme.txt 7.带选项的grep举例: grep –c ‘west’ datafile 3
解释计算datafile中含有west的总数。 8.egrep (扩展的grep)
egrep可以使用额外的正则表达式,如下表。
表9.egrep 举例:
egrep '2\.?[0-9]' datafile
解释:打印所有这样的行:它包含一个2,后跟0个或者一个句号,然后跟一个数字。 10. fgrep
fgrep 把所有的元字符都当作字符本身,只代表自己。 11. UNIX 工具试验参考答案(内容参考datebook) ● 打印包含San的行 grep 'San' datebook
● 打印所有以J开头的人名所在的行 grep '^J' datebook
● 打印以700结尾的行 grep '700$' datebook
● 打印所有不包含834的行 grep -v '834' datebook
● 打印出生在12月(December)的行 grep '/12' datebook
● 打印工资是6位数的行,并给出行号 grep -n '[0-9]\{6,\}$' datebook
第4章 流编辑器(sed)
1. sed 命令简介
sed 是流线型、非交互式编辑器。它允许你执行与vi 和ex编辑器里一样的编辑任务。Sed 程序不是与编辑器交互式工作的,而是让你在命令行里敲入编辑的命令,给文件命名,然后在屏幕上查看命令输出结果。 2. sed 如何工作
sed 编辑器按一次处理一行的方式来处理文件,并把输出送到屏幕上。 3. sed 可以用寻址的方式来决定想要编辑哪一行。 4. sed 命令和选项
篇二:Linux Shell实例精讲学习笔记
第一章:shell基础
●umask--查看当前用户创建文件或文件夹时的默认权限
eg:
[test@szbirdora 1]$umask
0002
[test@szbirdora 1]$ls -lh
-rw-rw-r-- test testmyfile
drwxrwxr-x test test 1
上面的例子中我们看到由test默认创建的文件myfile和文件夹1的权限分别为664,775.而通过umask查到的默认权限为002.所以可以推断出umask的计算算法为:
umaskfile directory
06 7
15 6
24 5
33 4
4 2 3
51 2
6 0 1
7 00
●连接ln
硬连接 ln sourcefile targetfile连接后的target文件大小和source文件一样
软连接 ln -s sourcefile targetfile 类似于windows的快捷方式
●shell script 基本结构
#!/bin/bash --------bash shell开头必须部分
# description --------注释部分(可有可无,为了阅读方便最好加以说明) variable name=value ---------变量部分,声明变量,赋值
control segment ---------流程控制结构,如判断、循环、顺序
eg.
helloworld.sh
#! /bin/bash
# This is a helloworld shell script
printchar = "hello world"
echo $printchar
[test@szbirdora 1]$sh helloworld.sh
hello world
●shell 特性
①别名 aliaseg. alias ll = “ls -l”
②管道 a |b 将a命令的输出作为b命令的输入 eg. ls |sort将ls列举的项排序
③命令替换a `b` 将b命令的输出作为a命令的输入 eg.ls `cat myfile` 列举出cat myfile的输出项
④后台运行nohup command& 可通过jobs -l查看后台运行的脚本
⑤重定向 >,< 可以改变程序运行的输出来源和输入来源 ⑥变量可以用$varname 来调用变量
⑦特殊字符
`用来替换命令
\用来使shell无法认出其后的特殊字符,使其失去特殊含义;允许一行放多个命令
() 创建成组的命令??
{} 创建命令块 ??
第二章:变量和运算符
●本地变量:在用户现在的shell生命期的脚本中使用。设置变量:various_name=value.可用set 来查看。用readonly可以使变量只读。
●环境变量:用于当前用户下所有用户进程(不限于现在的shell)。 设置变量:export various_name=value。用env查看。 用readonly可以使变量只读。
●变量替换
echo ${variable name} 显示实际值到variable name
echo ${variable name:+value} 如果设置了variable name,则显示其值,否则为空
echo ${variable name:?value} 如果未设置variable name,则显现用户定义错误信息value
echo ${variable name:-value}如果未设置,则显示其值
echo ${variable name:=value}如果未设置,则设置其值,并显示 ●清除变量unset variable name
●位置变量
位置变量表示$0,$1,$2...$9
$0 ----脚本名字
$1 ----根据参数位置表示参数1
eg.
#! /bin/bash
#parm.sh
echo "This is script name : $0"
echo "This is parameter 1: $1"
echo "This is parameter 2: $2"
[test@szbirdora 1]$sh parm.sh a b
This is script name : parm.sh
This is parameter 1: a
This is parameter 2: b
●向系统中传递位置变量
#!/bin/bash
#parm.sh
find /u01/test/1 -name $1 -print
[test@szbirdora 1]$ sh parm.sh myfile
/u01/test/1/myfile
●标准变量bash默认建立了一些标准环境变量,可在/etc/profile中定义
EXINIT
HOME
IFS
LOGNAME--当前登录用户名
MAILPATH
PATH
TERM --终端信息
TZ --时区
PS1--登录提示,如[test@szbirdora 1]$
[test@szbirdora 1]$ echo $PS1
[\u@\h \W]\$--\u -user --\h -host --\W -document
PS2--一命令多行,换行提示,如> PWD--当前目录
MAILCHECK --每隔多少秒检查是否有新邮件
[test@szbirdora 1]$ echo $MAILCHECK
60
SHELL
MANPATH--帮助文档位置
TERMINFO --终端信息
●特殊变量
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的进程ID号
$@传递到脚本的参数列表,并在引号中返回每个参数
$- 显示shell使用的当前选项,与set命令功能相同
$?显示最后命令的退出状态,0表示没有错误,其他表示有错误 eg.
#!/bin/bash
#parm
echo "this is shellname: $0"
echo "this is parm1 : $1"
echo "this is parm2 : $2"
echo "show parm number : $#"
echo "show parm list :$*"
echo "show process id:$$"
echo "show precomm stat: $?"
[test@szbirdora 1]$ sh parm.sh a b
this is shellname: parm.sh
this is parm1 : a
this is parm2 : b
show parm number : 2
show parm list :a b
show process id:24544
show precomm stat: 0
●影响变量的命令
declare 设置或显示变量
-f 只显示函数名
-r 创建只读变量
-x 创建转出变量
-i 创建整数变量
使用+替代-,可以颠倒选项的含义
export
-p显示全部全局变量
shift[n] 移动位置变量,调整位置变量,使$3赋予$2,使$2赋予$1 n 前移n
typeset 和declare同义
注意:双引号不能解析$,\,`三个字符,所以在双引号中可以引用变量、转义字符、替换变量
单引号可以解析,所以单引号中引用变量等无效
[test@szbirdora 1]$ echo "$test"
test
[test@szbirdora 1]$ echo '$test'
$test
●运算符类型
⒈按位运算符
~ 取反
<<左移运算符
>>右移运算符
& 与
| 或
^ 异或
$[ ] 表示形式告诉shell对方括号中表达式求值 $[a+b]
2.逻辑运算符
&&
||
>,<,=,!=
3.
赋值运算符
let variablename1 +=variablename1+ varablename2
1.echo echo [option] string
-e 解析转移字符
-n 回车不换行,linux系统默认回车换行
转移字符 \c \t \f \n
#!/bin/bash
#echo
echo -e "this echo's 3 newlne\n\n\n"
echo "OK"
echo
echo "this is echo's 3 ewline\n\n\n"
echo "this log file have all been done">mylogfile.txt
[test@szbirdora ~]$ sh echod.sh
this echo's 3 newlne
OK
this is echo's 3 ewline\n\n\n
上面可以看到有-e则可以解析转移字符,没有不能解析。echo空输出为空
2.read 可以从键盘或文件的某一行文本中读入信息,并将其赋给一个变量 read variable1 variable2
eg.
#!/bin/bash
#readname
echo -n "first name:"
read firstname
echo -n "last name:"
read lastname
echo "this name is $firstname $lastname"
3.cat 显示文件的内容,创建内容,还可以显示控制字符
cat [options]filename1 filename2
-v显示控制字符(Windows文件)
cat命令不会分页显示,要分页可以采用more、less
篇三:unix shell 范例精解第11章学习笔记
1.1.1环境
初始化文件是在用户登录时,初始化一些参数为目的。主要有三个
(1)/etc/profile 系统管理员可读写,为所有用户设置初始化参数
(2)$HOME/.profile 每个用户各自的初始化文件
(3)$HOME/.kshrc 需要在.profile文件中设置了ENV参数才会执行该文件。
1.1.2 set命令
set –o 选项 用于设置位置参数
set +o 选项 用于去除位置参数
set 选项:
allexport -a 设置变量自动导出
bgnice后台任务在更低优先级下运行
vi 使用vi作为编辑器
emacs使用emacs作为编辑器
ignoreeof 禁止用^D(Ctrl+D)登出
monitor -m 允许作业控制
1.1.3. 提示符
默认主提示符为PS1=”$”
1.1.4.搜索路径
在命令行输入命令后,ksh会在PATH变量所列的目录中搜索该命令,如果找不到,提示ksh:filename not found
1.1.5 句点命令.
句点命令(.)是ksh的一个内置命令,该命令将一个脚本文件名作为命令参数,该脚本在
句点命令通常在.profile或ENV文件修改后,重新执行他们。
1.2.1 shell启动过程
init -> getty -> login -> ksh
1.3 命令行
1.3.1 命令行执行次序
(1)关键字(如if,while,until)
(2)别名
(3)内置命令
(4)函数
(5)脚本和可执行程序
可以通过type命令来检查命令的类型,type命令为whence -v的别名
1.3.2退出状态
命令或者程序终止后,会向父进程返回一个退出状态。退出状态是一个0~255之间的证书。
如果返回状态为0,表示命令执行成功;
如果返回状态为非零,则表示命令执行不成功
返回状态存储$?变量中
1.3.3 含多条命令的命令行和命令组
可以在同一行输入多个命令,命令之间使用;分号隔开
command1;command2
1.3.4 命令的条件执行
command1 && command2 如果command1执行成功,这执行command2;如果前者执行不成功,这不执行后者。
command1 || command2 如果command1执行不成功,这执行command2;如果前者执行成功,这不执行后者。
1.3.5 后台执行的命令
command& 在命令后面添加&后,该程序将在后台执行。将产生一个作业ID进入后台执行,可以使用jobs查看改作业。
1.3.6 命令行历史
可以使用history命令查看执行过的命令,用户执行过的命令都贮存在~/.sh_history中。
可以重用r命令重复执行命令
r +command 将执行command命令最后一次执行的情况
r + number 将执行序列为number的command
1.3.7 命令行编辑
ksh 内置vi和emacs编辑器,
可以通过下来命令来设置默认编辑器
set -o vi 或 VISUAL=vi 或 EDITOR=/bin/vi
1.4 文件名扩展
aix中不支持,linux 可以使用tab键
1.5 别名
别名是ksh或者用户定义的一个命令的缩写,别名可以包括字母和数字。 alias 可以查看所有别名
alias cl='clear' 可以创建别名
unalias cl 可以删除别名
alias -t 可以参看所有别名定位
1.6作业控制
作业控制来控制前台和后台作业的执行
一般系统都开启来作业控制,如果没开启可以使用set -o monitor
jobs 或 jobs -l 列出所有的未完成的进程
^Z (Ctrl + Z)停止当前作业
fg %n 在前台运行后台作业
bg %n 在后台运行作业
wait %n 等待作业号为n的作业结束
kill %n 总之作业号为n的作业
1.7 元字符
元字符是代表自身以外的内容的特殊字符
主要有以下一些
\ 按字面含义解释他后面那个字符
& 在后台处理
; 分割命令
$ 替换变量
? 匹配单个字符
* 匹配零个或多个任意字符
(cmds) 在子shell中执行命令
{cmds} 在当前shell中执行命令