linux shell 快速参考(unix/linux shell分析及高级编程读书笔记)

来源:互联网 发布:淘宝支付前怎么改地址 编辑:程序博客网 时间:2024/05/19 17:10

LINUX shell

*************************************************************************
*1, 文件及权限
*************************************************************************
chmod who [operator] [permission] filename

相对模式:
operator: +/-
permission:r,w,x,l(给文件加锁),s(设置文件宿主或组set_ID),t(粘帖位)

绝对模式:
权限: r(2), w(4), x(1)
uid:  owner(set_uid)(2), group(set_gid)(4), 粘帖位(1)
设置uid时把uid的绝对组合数字放在最前面

umask:
允许设置文件创建时的缺省模式, 对每一类用户存在相应的mask数字, 对于文件
该值最大为6, 因为系统不允许在创建文件时赋予执行权限, 对于目录来讲最大
值为7, 例子:
 
(目录) umask: 101    对应的权限为676

 

*************************************************************************
*2, 文件名替换
*************************************************************************
*  匹配任何字符串
?  匹配单个字符串
[...] 匹配其中的任何字符
[!...]匹配非!之后的字符

 


*************************************************************************
*3, shell 的输入与输出
*************************************************************************
echo 输出语句
read 变量1 变量2 ...
cat  用来显示文件 分割显示文件 显示控制字符
tee  把一个副本传递到标准输出同时也把另一个副本COPY到相应的文件中

shell 3个相关的文件描述符:
0 标准输入
1 标准输出
2 标准错误

文件重定向:
>   定向到文件
>>  追加到文件

对标准错误重定向时必须是文件描述符:

command 0/1/2 >/>> filename
command >/>> filename 0/1/2>&0/1/2


command < filename
command << delimiter 从标准输入中读入直到遇到delimiter分界符
command <&m 把m作为标准输入
command >&m 把标准输出重定向到m中去
command <&- 关闭标准输入

 

 

*************************************************************************
*4, shell 命令的执行顺序
*************************************************************************
&&  如:命令1 && 命令2 只有命令1返回真(0),命令2才被执行
||  如:命令1 || 命令2 如果命令1执行失败, 则执行命令2
()  在当前shell执行一组命令, 如(命令1;命令2;...), 如用{}则组中所有的命令的输出
    作为一个整体被重定向时,则放到子shell执行否则放到当前shell执行
   
   

 

*************************************************************************
*5, 文本过滤(正则表达式)
*************************************************************************
^                匹配行首     如^c
$                只匹配行尾   如$c
*                一个单字符后跟*, 匹配0或多个此字符
[]               匹配[]内字符, 可以是单字也可以是字符序列, 也可以使用-表示字符范围,如[1-5]
/                用来匹配一个元字符的特殊含义
.                匹配任意单字符
pattern/{n/}     匹配前面的pattern,n为次数
pattern/{n,/}m   同上但次数至少为n
patterb/{n,m/}   同上但次数在n与m之间

 

 

*************************************************************************
*5, awk, 主要用来格式化文本
*************************************************************************
awk脚本:
   可以使用-F指定分割符, 如果未指定则使用空格

模式和动作:
   模式可以式任何语句, 模式包含BEGIN和END两个字段, 实际动作在{}内指定, 模式可
   以省略

域和记录:
   awk执行时其浏览域标识为$1,$2..., 使用$0表示使用所有域

正则表达式:
   除了grep的正则表达式之外,awk还支持另外两个:
   + 匹配一个或多个字符
   ? 匹配模式出现频率,如/XY?Z/匹配XYZ和XZ
   表达式需要用斜线括起来

条件操作符:
   <, <=, ==,!=, >, >=, ~(匹配正则表达式), !~(不匹配正则表达式), 如:
   awk '{if($4~/brown/) print $0}' grade.txt

符合表达式:
   &&  语句两边必须同时匹配为真
   ||  语句两边必须有一个匹配为真
   !   非

内置变量:
   ARGC     命令行参数个数
   ARGV     命令行参数排列, 每个参数使用ARGV[n]访问, 下标以0开始
   ENVIRON  支持队列中系统环境变量的使用, 如ENVIRON["PATH"] = "usr/local/bin"
   FILENAME awk浏览的文件名,
   FNR      浏览文件的记录数
   FS       设置输入域分割符等价于-F选项
   NF       浏览记录的域个数
   NR       已读的记录数
   OFS      输出域分割符, 缺省为空格
   ORS      输出记录的分割符, 缺省为/n
   RS       记录分割符号, 缺省为/n
  
操作符:
   =, +=, *=, /=, %=, ^=
   ? 条件表达式操作符
   ||, &&, !
   ~, !~
   <,<=,==,!=,>,>=
   +,-,*,/,%,^
   ++, --

内置字符串函数:
   gsub(r,s),   在整个$0中用s替代r
   gsub(r,s,t)  在整个t中用s替代r
   index(s,t)   返回s中字串t的第一位置
   length(s)
   match(s,r)   测试s是否包含匹配r的字符串
   split(s,a,fs)在fs上将s分成序列a
   sprintf(fmt,exp), 经格式化后的exp
   sub(r,s)     用$0中最左边最长的字符串代替s
   substr(s,p)  返回s中以p开始的部分
   substr(s,p,n)

输出函数:
   printf([格式控制符], 参数)
  
   修饰符:
   格式:
   -        左对齐
   .prec    最大字符串长度或小数点右边的位数
   Width    域的步长, 用0表示0步长
  
   格式符号:
   %c       字符
   %d
   %e      
   %f
   %g       awk决定使用哪种浮点数转换e或者f
   %o       八进制数
   %s
   %x       十六进制
  

awk数组:
   使用数组前不必定义也不必指定数组元素的个数, 如:
   '{split("123#224#245", myarrary, "#")}'
  
   也可以先定义再使用.
  
  
  
*************************************************************************
*6, sed 文本过滤工具
*************************************************************************
sed [选项] sed命令  输入文件

sed [选项] -f 脚本文件 输入文件


查询方式:
   sed默认从第一行开始
   定位方式:
   x   为一行号
   x,y 行范围
   /pattern/ 查询包含模式的行
   /pattern/pattern/ 查询包含两个模式的行
   /pattern/,x  在指定的行上查询包含模式的行
   x,/pattern/  通过行号和模式查询匹配行
   x,y!查询不包含指定行号x,y的行
  
   命令:
   p  打印匹配行
   =  显示文件行号
   a/ 在定位行号后附加新文本信息
   i/ 在定位行号号插入新文本信息
   d  删除定位行
   c/ 用新文本替换定位行
   s  使用替换模式替换相应模式
   r  从另一个文件中读文本
   w  写文本到一个文件
   q  第一个模式匹配后退出
   l  显示与8进制ASCII代码等价的控制字符
   {} 在定位行执行的命令组
   n  从另一个文件中读取下一行, 并附加在下一行
   g  将模式2粘贴到/pattern n/
   y  传送字符
   n  延续到下一输入行, 允许跨行的模式匹配语句
  
  
   例子:
   sed -n '2p' filename 第二行开始
   sed -n '1,3p' filename 1~3行
   sed -n '/pattern/p' filename
   sed -n '4,/pattern/p'
   sed -n '1,$p' filename 显示整个文件, $表示最后一行
   sed -n '/pattern/=' 显示行号
   sed '/pattern/a/text' 附加文本,在指定行后面
   sed '4i/text' 插入文本, 在指定行前面
   sed '/pattern/c/text' 替换指定行
  
  
  
   替换文本:
   [address[,address]] s/pattern-to-find/replace-pattern/[g p w n]
   g  缺省只替换一次出现模式, 使用g替换全局所有模式
   p  缺省sed将所有被替换行写入标准输出,使用p将不打印结果
   w  文件名  将输出定向到一个文件
  
  
  
  
*************************************************************************
*7, 工具
*************************************************************************
tr     字符转换删除和替换
stty   设置终端特性

 

 


*************************************************************************
*8, shell环境及变量
*************************************************************************
本地变量:
variable-name = value 设置实际值到变量
variable-name + value 如果设置了variable-name则重设其值
variable-name :? value 如果未设置variable-name 显示未定义用户错误信息
variable-name ? value  如果未设置variable-name 显示系统错误信息
variable-name := value 如果未设置设置其值, 如果设置则使用原值
variable-namne :- value 如果未设置使用value替换但并不设置value到variable-name, 如果设置
                        则使用其值

unset variable 清除变量
set  variable value 设置变量 如果不提供参数则显示所有本地变量

测试变量是否设置值:
echo "The file is ${FILE?}"
echo "The file is ${FILE:? sorry ....}"

设置只读变量:
readonly variable-name

设置环境变量:
export variable-name

env 显示所有环境变量

unset variable 清除环境变量

 

预留的变量名:
CDPATH  cd 一个目录时查找此变量
EXINIT  保存VI初始化时的设置
HOME    HOME目录
LFS     用来指定shell缺省的分割符
LOGNAME 保存登陆名
MAIL    保存邮箱路径名
MAILCHECK 缺省为每60秒检查一次新邮件
MAILPATH 如果有多个邮箱要用到MAILPATH,此变量将覆盖MAIL设置
PS1     shell提示符,缺省对root为#, 其他用户为$
PS2     shell附属提示符, 缺省为>, 用于执行超过一行的一个命令
SHELL   缺省shell
TERMINFO 终端初始化变量保存终端初始化配置
TERM    终端类型
TZ      时区
EDITOR  缺省的编辑器
PWD     当前路径名
PAGER   屏幕翻页命令
MANPATH man路径
PRINTER 缺省打印机名


向脚本传递参数, 用空格分割, $0~$9 其中$0始终保存的脚本名


特定变量参数:
$#  传递到脚本的参数个数
$*  以单个字符变量显示所有传递的参数,此选项参数可以超过9个
$$  当前脚本进程的ID号
$!  后台运行的最后一个进程的ID号
$@  与$#相同但是使用时加引号
$-  SHELL的当前选项,与set相同
$?  显示命令的最后退出状态, 0为没错误, 其他任何值表示有错误

 

 


*************************************************************************
*9, 引号
*************************************************************************
使用双引号可以引用除字符$,反引号,/以外的任何字符
使用双引号可以引用任何值
使用反引号用于将系统命令输出到变量
反斜线引用特殊字符:&*+^$'""|?

 

 

*************************************************************************
*10, 条件测试
*************************************************************************
测试文件状态:
test condition 或 [ condition ] 使用[]要在两边加上空格
-d 目录
-f 正规文件
-L 符号连接
-r 可读
-s 文件长度大于0非空
-w 可写
-u 文件具有suid位设置
-x 可执行
-e 存在
-b 块文件
-c 字符设备文件
-g 设置了guid位
...

如: [ -f filename ]
    echo $?
   
测试时使用逻辑操作:
-a 逻辑与 -o 逻辑或 !逻辑非, 如:
[ -w result.txt -a -w test.txt ]

字符串测试:
test "string"
test string_operator "string"
test "string" string_operator "string"

string_operator:
= 相等
!= 不等
-z 空串
-n 非空串

测试数值:
"number" number_operator "number"

[ "number" number_operator "number" ]
-eq 相等
-ne 不等
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于

expr 用于数值计算:
exper argument operator argument

 

 

*************************************************************************
*11, 控制流结构
*************************************************************************
if-else:
if 条件1
then
   命令1
elif 条件2
then
   命令2
else
   命令3
fi

空命令永远为真

case 语句:
case 值 in
模式1)
   命令1
   ...
   ;;
模式2)
   命令2
   ...
   ;;
esac


for循环:
for 变量名 in 列表
do
   命令1
   命令2
   ...
done


until循环:
until 条件
do
   命令1
   命令2
   ...
done


while 循环:
while 命令
do
   命令1
   命令2
   ...
done

 

可以使用break continue 控制流程, 对case及循环有效

 

 

*************************************************************************
*12, shell 函数
*************************************************************************
格式:
函数名()
{
命令1
命令2
} 或
函数名() {
}

也可以在函数名前面加上function

参数传递:
和在shell中使用参数一样如$1 ~ $9, 如:

test() {
   echo $1
   echo $2
   echo $3
}
调用: test 1 2 3

函数返回:
return 返回用最后的命令状态决定返回值
return 0
return 1

在shell中定位文件:
定位格式为:
. pathname

执行函数:
函数名  参数 ...

删除函数:
unset 函数名

 


*************************************************************************
*13, 向脚本传递参数
*************************************************************************
shift 命令:
他每执行一次参数个数减一且值向前移动一位,如:
while [ $# -ne 0 ]
do
   echo $1
   shift
done

 

 

*************************************************************************
*14, 创建屏幕输出
*************************************************************************
tput:
    字符输出:
    bel       警铃
    blink     闪烁
    bold      粗体
    civis     隐藏光标
    clear     清屏
    cnorm     不隐藏光标
    cup       移动光标位置到x,y
    el        清除到行尾
    ell       清除到行首
    smso      启动突出显示
    rmso      正常显示
    smul      开始下划线模式
    rmul      停止下划线模式
    sc        保存当前光标位置
    rc        恢复光标位置
    sgr0      正常屏幕
    rev       逆转视图
   
    数字输出:
    cols      列数目
    it        TAB设置宽度
    lines     屏幕行数
   
    布尔输出:
    chts  光标不可见
    hs    具有状态行

例子, 使用布尔输出:
    STATUS_LINE=`tput hs`
    if $STATUS_LINE; then
      echo "Your terminal has a status line"
    else
      echo "Your terminal don't has a status line"
    fi
   
   
使用颜色:
    前景色:
    30(黑)  31(红)  32(绿)  33(黄)  34(蓝)  35(紫) 36(青) 37(白)
    背景色:
    40(黑)  41(红)  42(绿)  43(黄)  44(蓝)  45(紫) 46(青) 47(白)
   
    颜色格式:
    <ESCAPE>[background_number;foreground_number]m
    例子:
    echo -e "/033[40;32m"
   
   

 


 

原创粉丝点击