unix shell 范例精解第11章学习笔记.docx
《unix shell 范例精解第11章学习笔记.docx》由会员分享,可在线阅读,更多相关《unix shell 范例精解第11章学习笔记.docx(9页珍藏版)》请在冰豆网上搜索。
![unix shell 范例精解第11章学习笔记.docx](https://file1.bdocx.com/fileroot1/2023-1/24/3d629889-1651-4e8c-93ca-cbb75d6bf8f6/3d629889-1651-4e8c-93ca-cbb75d6bf8f61.gif)
unixshell范例精解第11章学习笔记
1.1.1环境
初始化文件是在用户登录时,初始化一些参数为目的。
主要有三个
(1)/etc/profile 系统管理员可读写,为所有用户设置初始化参数
(2)$HOME/.profile每个用户各自的初始化文件
(3)$HOME/.kshrc 需要在.profile文件中设置了ENV参数才会执行该文件。
1.1.2set命令
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:
filenamenotfound
1.1.5句点命令.
句点命令(.)是ksh的一个内置命令,该命令将一个脚本文件名作为命令参数,该脚本在当前shell环境下执行时不启动子进程。
句点命令通常在.profile或ENV文件修改后,重新执行他们。
1.2.1shell启动过程
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-ovi或VISUAL=vi或EDITOR=/bin/vi
1.4文件名扩展
aix中不支持,linux可以使用tab键
1.5别名
别名是ksh或者用户定义的一个命令的缩写,别名可以包括字母和数字。
alias可以查看所有别名
aliascl='clear'可以创建别名
unaliascl可以删除别名
alias-t可以参看所有别名定位
1.6作业控制
作业控制来控制前台和后台作业的执行
一般系统都开启来作业控制,如果没开启可以使用set-omonitor
jobs或jobs-l列出所有的未完成的进程
^Z(Ctrl+Z)停止当前作业
fg%n在前台运行后台作业
bg%n在后台运行作业
wait%n等待作业号为n的作业结束
kill%n总之作业号为n的作业
1.7元字符
元字符是代表自身以外的内容的特殊字符
主要有以下一些
\ 按字面含义解释他后面那个字符
& 在后台处理
; 分割命令
$ 替换变量
?
匹配单个字符
* 匹配零个或多个任意字符
(cmds) 在子shell中执行命令
{cmds} 在当前shell中执行命令
1.8文件名替换(通配符)
1.8.1noglob变量
set-onoglob可以关闭文件名替换,即不允许*、?
等替代文件名
1.8.2代字符号和连字符号扩展
~ 表示当前用户的home目录
~user 表示user用户的home目录
~+ 当前目录的完整路径
~- 此前目录的完整路径
- 此前的目录
$OLDPWD 此前的目录
1.8.3通配符
元字符
含义
*
匹配零个或多个字符
?
匹配一个字符
[abc]
匹配a、b、c这组字符中的一个
[!
abc]
匹配除a、b、c以外的任一字符
[a-z]
匹配a到z范围内的任一字符
\
转义或精致后面那个元字符
1.9变量
1.9.1局部变量
(1)局部变量的值只能在当前shell中可见,不可以传递给子shell。
(2)要提取变量值只需在变量前添加美元符$,但只需部分字符串的为变量时,需要用{}括起来。
例如echo${car}go只会打印出$car的变量值后面跟上go
(3)设置只读变量,如下,test为只读变量
typeset-rtest=tom
(4)特殊变量$$为当前shell的ID
1.9.2环境变量
(1)环境变量对创建他们的shell和该shell派生的所有子shell和进程都可见。
按照惯例所有环境变量都应该大写
(2)可以使用export命令命名环境变量
1.9.3列出已设置的变量
set命令将输出所有的变量,包括局部变量和全局变量
env命令只显示全局变量
typeset命令显示所有的变量、整数、函数和已导出的变量
set-o命令显示ksh的所有选项
1.9.4复位变量
unset变量名
1.9.5显示变量的值
原先的echo命令还可以使用,但是推荐使用新的命令print,下面为print的一些选项
选项
含义
-
所有跟在他们后面的参数都不被认为是选项参数。
短线允许出现连字符的参数如-2
-f
在1988ksh版本以后出现,用力啊模拟printf
-n
标准输出不换行,如同echo-n
-p
发送输出到连接的进程或者管道而不是标准输出上
-r
阻止print命令对转义序列进行解释
-s
输出结果作为命令被追加到历史文件中,而非标准输出中
-un
重定向输出到文件描述符n上
1.9.6转移序列
转义序列由一个反斜杠后跟一个字符构成,当该字符序列包含在引号(单双引号都可以)中时,有着特殊的含义。
转移序列
含义
\a
响铃字符
\b
退格
\c
取消信号并忽略其后的任何参数
\f
换页
\n
换行
\r
回车
\t
制表符
\v
纵向制表符
\\
反斜杠\
\0x
一个用1、2或者3位ASCII值表示的8位字符,如\0123,显示结果为S
\E
作为转移序列使用,仅出现在1988年之后的版本中
11.9.7变量表达式和扩展修饰符
11.9.8变量子字符串扩展
11.9.9变量属性:
typeset命令
typeset可以控制一些变量属性,显示函数属性
命令
所做的动作
typeset
显示所有的变量
typeset-inum
将num设置为整型
typeset-x
显示所有已经导出的变量
typesetabc
设置局部变量a、b、c
typeset-f
列出函数以及其定义,函数其实是它的别名
typset-rx=foo
将x设置为只读变量,值为foo
typeset+f
列出函数名称
11.9.10位置参数
shell脚本通常使用特殊内置变量--位置参数(positionalparameter)从命令行接受参数,位置参数还被函数用来保存传递给它的参数。
可以使用set来设置位置参数
参数表达式
作用
$0
表示当前shell脚本的名字
$1-$9
代表第1到第9个位置参数
${10}
第10个位置参数
$#
其值为位置参数的个数
$*
其值为所有的位置参数
#@
除了加双引号的情况,作用与$*相同
"$*"
其值为“$1$2$3"等
"#@"
其值为“$1”“$2”“$3"等
11.9.11其他特殊变量
变量
含义
$$
当前shell的PID
$-
当前的ksh选项设置
$?
shell执行的上一条命令的退出状态
$!
最后一个进入后台的作业的PID
11.10引用
11.10.1反斜杠
反斜杠用于防止单个字符被解释。
11.10.2单引号
单引号必须配对使用,以用来保护所有元字符不被解释。
要显示单引号,必须使用双引号包含起来,或者一个反斜杠对其进行转义。
11.10.3双引号
双引号必须配对使用,它允许其中的变量和命令替换但保护其他元字符不被shell解释。