第一章 文件安全与权限
文件
目录
setuid
chown
chgrp
umask
suid
guid
粘滞位
suid —> -rwSrwxr–
guid —> -rwxrwSr–
t —> -rwxrwxr-T
suid: 执行此文件时具有此文件owner的权限
guid: 执行此文件时具有此文件group的权限
t: 若出现在目录上,只有目录的owner才能删除;若出现在文件上,执行时会被放在交换区。
chmod u+s xxx.txt
chmod g+s xxx.txt
chmod +t xxx.txt
4个8进制数中的第一个:1代表T, 2代表guid,3代表suid
第二章 find和xargs
xargs可防止参数列表溢出。
xargs是一个命令。
Buid and excute command lines from standard inputs.
find:
忽略某目录:-prune -o -print
cpio命令:向磁带中备份文件或从中恢复文件。
第三章 后台执行命令的方法
cron
crontab
at
&
nohup
ctrl-z
bg
fg
jobs
第四章 模式匹配
通配符:
*
?
[…]
[!…]
第五章 shell输入输出
echo
read
cat
管道: |
tee: xx.sh | tee xx.log
0:标准输入
1:标准输出
2:标准错误输出
六 命令执行顺序
&&
||
(cmd1; cmd2; cmd3; …) 在当前shell中执行这些command
{cmd1; cmd2; cmd3; …} 在子shell中执行这些命令
七 正则表达式
BRE: 标准正则表达式
ERE: 扩展正则表达式
^ 行首
$ 行尾
. 单字符
* 重复单字符
[] 范围
\ 转义
pattern{n} 重复n次
pattern{n,} 重复n次以上
pattern{n,m} 重复n~m次
八 grep
grep、egrep、fgrep
九 awk
略
十 sed
略
十一
sort
uniq
join
cut
past
split
十二
tr的用法
十三 登陆
步骤:
1. /etc/passwd
2. /etc/profile
3. ~/.profile
/etc/passwd
冒号分隔的七个域,分别为登录名、密码、。。。
第5域为用户全名,第6域为用户根目录,第7域为用户登录的shell
登陆时先后执行 /etc/profile 和 ~/.profile, 登出时执行 ~/.logout
十四 环境和变量
引用变量时最好用花括号括起来,${variabl}
设置变量的方法:
=
+
:?
?
:=
:-
unset 清除变量
set 显示本地变量
${val:-value} 测试val是否已设置,若val已试着则使用val,否则使用value
readonly 设置某变量为只读。
环境变量
- 通常全大写
- unset可清除指定的环境变量
- shell中的环境变量:CDPATH, EXINIT, HOME, IFS, LOGNAME, MAIL, MAILCHECK, MAILPATH, PATH, PS1, PS2, SHELL, TERMINFO, TERM, TZ, CDITOR, PWD, PAGER, MANPATH, LPDEST/PRINTER
- set -a 导出所有变量
- export 导出指定变量
- 位置变量:
$0,$1,$2, ...,$9
- 特性变量:
$#, $*, $$, $!, $@, $-, $?
- 引号:双引号,单引号, 反引号
- 双引号中不能直接放
$ ` \
其他字符都可以。 - 单引号,shell会忽略其中的任何引用值。
- 反引号,用于设置系统命令的输出到变量。shell将反引号中的内容作为系统命令。
- 反斜线(反斜杠)屏蔽特殊意义的字符。特殊意义的字符:
& * + ^ \$ ` " | ?
- 表达式,expr
- echo -e,可以使用\n, \r, \c等。
十六 脚本
\#!/bin/bash
十七 条件测试
test两种格式:
test condition
[ condition ]
测试文件状态:
-d
-f
-L
-r
-s
-w
-u
-x
-a 与
-o 或
! 非
= 字符串相等
!=不等
-z 空
-n 非空
数值测试:
-eq
-ne
-gt
-lt
-le
-ge
例:[ “$Number” -eq “130” ]
expr:
expr 10+10
expr 10 \* 10
Loop=`expr $Loop + 1`
expr xx + 1
echo $?
十八 控制流程
退出状态
#?
exit n
$$
||
控制流程
分支:
if then else fi
case
循环:
for
until
while
1.变量值测试
if [ "$NAME" = "" ]
2.grep输出检查
if [ grep 'Dave' data.file > /dev/null 2>&1 ]
3.用grep测试变量
if [ echo $list | grep "peter" > /dev/null 2>&1 ]
4.测试文件拷贝
if [ cp file file.bak ]
5.当前目录测试
if [ `pwd` != "/" ]
6.文件权限测试
if [ ! -w "$LogFile" ]
7.测试传递到脚本的参数
if [ $# -lt 3 ]
8.测试脚本是交互模式还是非交互模式(cron或at)
if [ -t ]
9.变量是否已经设置
if [ -z $EDITOR ]
10.检查运行脚本的用户
if [ $LOGNAME != "root" ]
LOGNAME是环境变量
11.空命令 “ : ”(冒号)
12.elif
case的用法
case $xxx
xx) xxxx
;;
yy) yyyy
;;
*) ****
;;
esac
for的用法
for 变量名 in 列表
1. for loop in 1 2 3 4 5
2. for loop in "orange red blue grey"
3. for loop in `ls`
4. for params in "$@"
5. for params in "$*"
省去in列表项是时,它将接受命令行位置参数作为参数
for params
do
echo $params
done
until的用法
until [ condition ]
do
xxx
done
while的用法
while [ xxx ]
do
xxx
done
例:
while [ "$count" -lt "50" ]
do
count=`expr $count + 1`
done
while read FILM
do
echo $FILM
done
while read LINE
do
echo $LINE
done < xxx.txt <---- 从文件读取
分隔符IFS:
默认的分隔符是空格。
可以临时改变分隔符。
SAVEDIFS=$IFS
IFS=:
xxx
IFS=$SAVEDIFS
十九 函数
定义三种方法:
函数名()
{
xxx
}
函数名(){
xxx
}
function 函数名(){
xxx
}
向函数传递参数:
1.调用函数时,将参数写在函数名后面
2.在函数中用$0 $1 $2...
引用参数
从函数中返回:
return
return 1
return 0
使用函数:
收集一些常用函数,将它们放在文件中,文件开头要有#!/bin/sh
,文件名任意。使用source或 . 将函数载入当前shell。
其实载入的不仅仅是函数,也包含变量。
检查载入的函数: set
清除函数:unset
修改函数:unset —> 修改 —> 重新载入
在脚本中使用函数:直接通过函数名调用。
二十 向脚本传递参数
shift
每次将参数位置向左偏移一个位置,同时也改变$#
shift n
:向左偏移n个位置
shift `expr $#-2`
:移到最后一个参数
getopts
while getopts ahfgv OPTION
do
case $OPTION in
a)
;;
h)
;;
......
done