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之间
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,部分命令总结
. 命令
一般格式:. file
“点”命令让shell运行给定的文件,就跟把文件中的内容在这里键入一样。
alias 命令
一般格式:alias names=string
alias命令把string赋给别名name,每当name用作命令时,shell就替换为string,在这完成后在进行命令行替换。
unalias命令
一般格式:unalias names
把别名names从别名表中删除。-a选项表示删除所有别名。
set命令
一般格式:set options args
该命令把options指定的选项打开或关闭,也可以用它来根据args设置位置参数。如果在单字符前有个减号(-)则打开该选项;如果前面是一个加号(+) 则关闭该选项。
unset命令
一般格式:unset names
该命令让shell把names中列出的变量或函数的定义删除。但不能清除只读变量。
type命令
一般格式:type commands
该命令显示所有有关给定命令的信息。
echo命令
一般格式:echo args
该命令把args写入到标准输出。如果省略args,作用就是跳过一行。
exec命令
一般格式:exec command args
执行exec时,shell用给定的参数为运行指定的命令command作初始化。该命令不像其他命令那样以一个新进程运行,而是用command代替当前进程(即不创建新进程)。
export命令
一般格式:export variables
export命令让shell把给定的变量标志为导出,它们的值要传递给子shell。