Unix Shell小结1

来源:互联网 发布:卡密授权系统源码 编辑:程序博客网 时间:2024/06/02 03:15

A-2
在管道线开头放一个!,则以管道线中最后一条命令的推出状态的
逻辑反作为管道线的退出状态。
执行的每条命令都返回一个数值,称为退出状态,0表示成功,非0表示失败。

A-4 参数和变量

A-4-1 shell变量
参数有三种类型:shell变量、特殊参数和位置参数。
shell变量名必须以字母或下划线字符(_)开头,后面可以跟任意多个字母、数字或
下划线字符。用
variable=value variable=value ...
可以在命令行中给shell变量赋值。对value不进行文件名替换。

A-4-2 位置参数
每当shell程序执行时,程序名就被赋给变量$0,命令行中键入的参数依次分别赋给
变量$1,$2,...。也可以用set命令对位置参数赋值。

A-4-3 特殊参数
$# 传给程序的参数个数,或者执行set命令设置的参数个数
$* 对位置参数等的集中引用
$@ 跟$*相似,区别在于当加了双引号后("$@"),集中引用位置参数"$1","$2",...等
$0 正执行的程序名
$$ 正执行程序的进程id
$! 最后一个发到后台运行的程序的进程id
$? 最后一个在前台执行的程序的退出状态
$- 当前有效选项标志

shell使用的其他变量
CDPATH 每当cd命令的参数不包含完全路径时,就在这些目录中搜索
ENV 交互方式启动运行shell时,要在当前环境中执行的文件
FCEDIT fc使用的编译器,如果不设置就使用ed
HISTFILE 如果设置了,它规定用来存放命令历史的文件;如果没有设置,
         或者它不可写入,则使用$HOME/.sh_history
HISTSIZE 如果设置了,则它规定编辑时可以存取的以前键入的命令数目;
  如果没有设置,默认值为128
HOME 用户的宿主目录,如果cd命令没有参数则转到该目录
IFS   内部字段分隔字符,通常其中包含三个字符:空格,水平制表符和换行字符。
LINENO shell在正执行的脚本中设置的行号,开始执行一行之前设置该变量,
 从1开始
MAIL shell周期性地在其中检查是否有邮件的文件名,如果有新邮件,shell就显示
 “有邮件”信息。
MAILCHECK 规定shell每隔多少秒到MAIL规定的文件或MAILPATH规定的目录中检查是否
    有新邮件。默认为600.
MAILPATH 检查有没有新邮件需要检查的文件清单。
PATH 由冒号分隔的目录列表,shell要查找需要执行的文件时就在这些目录中搜素。
 当前目录用::或:.:表示(如果它在开头或结尾,用:就足够了)。
PPID 调用本shell的程序的进程(即父进程)id号码
PS1 主命令提示符,通常是"$"
PS2 次命令提示符,通常是">"
PS4 追踪执行时显示的提示符(-x选项的shell或set -x)。默认为"+"
PWD 当前工作目录的路径名

A-4-4 参数替换
参数后面的冒号表示要测试是否已设置了该参数并且不为空,如果没有冒号,只检查
设置过没有。
$parameter或${parameter} 替换参数的值
${parameter:-value}  如果设置了parameter并且不为空则替换为parameter的值,
    否则替换为value
${parameter -value}  如果设置了parameter换为parameter的值,否则替换为value
${parameter:=value}  如果设置了parameter并且不为空则替换为parameter的值,
    否则替换为value并将它赋给parameter
${parameter=value}  ... 
${parameter:?value}  如果设置了parameter并且不为空则替换为parameter的值,
    否则把value写入标准错误并退出。如果跳过value,用parameter
    null or not set代替
${parameter?value}  ...
${parameter:+value}  如果设置了parameter并且不为空则替换为value的值,
    否则替换为空
${parameter+value}  ...
${#parameter}   替换为parameter的长度,如果parameter是*或@则结果不确定
${parameter#pattern}  把pattern从parameter左边删除,替换所得的结果,删除时采用最小匹配;
    其中可以使用文件名替换字符(*,?,[...],!和@等)
${parameter##pattern}  跟#pattern相似,区别是删除时使用最大匹配
${parameter%pattern}  跟#pattern相似,区别是从右边删除
${parameter%%pattern}  跟##pattern相似,区别是从右边删除时使用最大匹配

A-5 命令重返
A-6 引用
shell可以识别四种引用机制
'...' 去掉引号中所有字符的特殊意义
"..." 去掉引号中除$,'和/外所有字符的特殊意义
/c 去掉反斜杠之后的字符c的特殊意义。用在双引号中时,如果反斜杠后是
 $,',",换行或/,则去除这些字符的特殊意义,否则不做解释;用在行尾时
 作为续行符号(去掉换行字符)
'commnd'或
$(command)  执行command,并将它的标准输出插入该位置 

A-6-1 代字符替换
shell会检查命令行中的每一个词和变量是否以没被引用的~开头,如果是,则把该词
其他部分一直到/之间的内容作为一个登陆名看待,并在系统文件(一般是/etc/passwd)中查找,
如果找到该用户则用他的宿主目录替换字符和用户名,如果用户名不存在,则不作变化。
如果只有~或后面直接跟/,则替换为HOME变量值。

A-6-2 算术表达式
一般格式:$((expression)),shell计算整数算术表达式expression的值。

A-7 文件名替换
在对命令行的参数替换(和命令替换)完成之后,shell查找特殊字符*,?和[。
如果它们没被引用,则shell在当前目录中(如果前面加了/则在另一个目录中)搜索,
把所有匹配的文件名替换进去(shell首先对文件名排序)。如果没有找到匹配,则原来的
内容保持不变。
注意,以.开头的文件名必须显示地匹配(故echo * 不能显示隐含文件,而echo .*可以)。

A-9-1 (...)结构
如果把一条或多条命令放在小括号中,它们就会在子shell中执行。
A-9-2 {...;}结构
如果把至少一条命令放在大括号中,这些命令就由当前shell执行。
A-9-2深入shell变量
在命令行中的命令行之前加上对参数的赋值,可以shell变量放在一条命令的环境中。