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(白)
颜色格式:
[background_number;foreground_number]m
例子:
echo -e "\033[40;32m"