第1章
Linux/BSD 组成:内核 Shell 工具程序
Bash工作模式:互动模式,Shell Script模式
#! /bin/Bash
第2章 部署 Bash Shell
echo $SHELL 查看系统默认shell
echo $BASH_VERSION
su -
su -c "command" 命令执行完后恢复原来身份
第3章 基础
登录主机:本机登录 远程登录
远程登录:
ssh
telnet 192.168.1.2 12345
注销主机:ctrl+D,exit
文件:
一般文件(-)纯文本文件 二进制文件
目录(d)
设备文件(b)字符文件(c) 磁盘文件(b)
socket文件(s)
连接文件(Pipe/FIFO)(p)
特殊文件(符号连接文件)(l)
隐藏文件(.file_name)
file path(查看文件类型)
权限:读r4 写w2 执行1x
* 任意字符串,可空
? 一个字符,不可空
\ 字符转义
\ 续行符号
[abc] [a-z] [0-9] 任意一个字符串
[!a-z] 不是小写
[\!0-9] 等于[0-9!] :0-9和!
{}组合:
{g,nc,s}ftp匹配 gftp ncftp sftp
profile{,bak} 匹配 profile profile.bak
0标准输入 1标准输出 2标准错误
wc -l < file.log(显示行数 -w 字数,-c -bytes)
命令/script < 输入文件 > 转出文件
例如 sort < unsort.txt > sorted.txt
管道:命令1 | 命令2(命令1的输出变成命令2的输入)
后台工作:命令 &
第4章 Shell程序结构
在现行shell中执行:
. /root/tmp/test.sh
source /root/tmp/test.sh
shell排错:
Bash -v test.sh Jack (检查语法)
Bash -n test.sh(不执行,仅查看代码)
Bash -x test.sh(追踪.sh执行)
shopt -s -o nounset(避免错打变量名称)
shopt 设定Bash的功能选项
pwd_mkdb 产生/etc/passwd文件
echo $SHLVL(目前是第几层shell中)
Bash运行模式:互动模式 非互动模式./sh 以sh名称调用(sh file.sh) POSIX模式 限制功能模式
(50~)
第5章
Bash内置命令...
命令行程序...
命令1;命令2;命令3(./configure;make;make install) 不一定每个命令都成功
命令1&命令2&命令3(./configure&make&make install) 命令成功才执行下一个
echo (空白行)
com1 || com2 || com3 com1执行失败才往后执行
(com1;com2;com3) ()开启子shell执行命令组
{ com1; com2; com3 } 当前shell中执行命令组(不开启子shell),注意有空格符
记录命令执行过程:工具/usr/bin/script
过程:
$ script log.txt
$ 执行命令
$ exit (离开script)
第6章 变量与字符串操作
Bash所有变量都是“字符串”
变量不需生命
变量组成:数字 字符 _ (开头不可以0-9) 区分大小写
变量名=值 (=左右无空格)
取得变量值:$name ${name}
printf 格式化输出字符串
%s字符串 %q用\转义特殊字符
取消变量或函数(让变量不存在):unset name
unset -v 变量名
unset -f 函数名
清空变量:(变量存在,值为空)
name=
export 设置环境变量
export testVAR="Hello"
export 变量名
export 或者 export -p:列出所有目前的环境变量
declare -x VAR="VALUE" 设置环境变量(export)
bash完整路径:echo $BASH
echo $BASH_ENV (非互动式模式中适用)
echo $BASH_VERSION
... ...
只读变量:declare readonly
readonly 变量名
declare -f 变量名
readonly readonly -p 列出只读变量
readonly -f 函数名
readonly -a 数组名
declare
-r(只读) -x(设置环境变量) -i(整数) -a(数组)...
别名:
alias 别名=指令
取消别名:unalias 别名
unalias -a 取消所有别名
数组:
A[0]=5 A[1]=10 A[2]=15
echo ${A[1+1]}
B={12,23,34}
C={[3]=18 [1]=93 [5]=46}
E={124 [8]=188 266} [0]124 [8]188 [9]266
取出所有元素:echo ${B[@]} 或者 echo ${B[*]}
数组元素个数:${#B[@]} 或者 ${#B[*]}
若数组元素是字符串:${#B[索引]}
取消数组或数组元素:unset A, unset A[3]
Here Document(更多实例)
命令 << tag
...
tag
第7章 高级变量
r=${myname-'Basher'}
若myname不存在r='Basher',若myname存在r=$myname
r=${myname:-'Basher'}
若myname不存在或空值r='Basher',若myname有值r=$myname
r=${count:=100}
count不存在或空值r=count=100,count存在r=count count=默认值
${变量:?提示信息}
变量不存在或空值,显示提示信息并停止script
r=${变量:+'true'}
变量有值r=true,变量不存在或空值r=
字符串:
substr=${name:4} 起点~尾
substr=${name:1:3} 起点~长度
${#变量} 字符串长度
取得部分参数:
${@:起点}
${@:起点:个数}
expr:字符长度
len=${expr length "$str"}
len=${expr "$str":'.*'}
${变量#样式} 从左开始删最短的
${变量##样式} 从左开始删最长的
${变量%样式} 从右开始删最短的
${变量%%样式} 从右开始删最长的
${变量/样式/替换字符串} 只替换第一个
${变量//样式/替换字符串} 全部替换
${变量/样式/} 只删一个
${变量//样式} 全部删除
${变量/#样式/} 删除第一个符合样式的字符串,变量值开头开始对比
${变量/%样式/} 删除第一个符合样式的字符串,变量值尾部开始对比
${!变量名开头@} ${!变量名开头*} 列出变量名
${!数组变量[@]} ${!数组变量[*]} 列出数组所有索引值
命令替换:命令执行后的标准输出放入变量中
变量名=$(命令)
变量名=$(命令1;命令2)
命令替换里可以有其他命令替换:r=$(du -s $(pwd))
$((算术式))
第8章 算数运算
$((算术式)):r=$((2+5*8))
expr 算术式:r='expr 4+5'
$[算术式]:r=$[4+5]
declare -i 变量=算术式:declare -i r=3+5
let 算术式:let r=2+5
第9章 流程控制
$? 存储每个命令执行后传回的状态值
if 条件测试; then
命令
fi
if 条件测试; then 命令;fi
if 条件测试; then
命令
else
命令
fi
if 条件测试; then
命令
elif 条件测试; then
命令
else
命令
fi
if 条件测试
then
命令
elif 条件测试
then
命令
else
命令
fi
! 命令 (有空格符,返回命令执行结果的相反值)
((算式)) 算式的运算结果不0则传回真值0,算式的运算结果0则传回假值1
[[判断式]]
if [[判断式]]...(0真,非0假)
if test "str" \> "xyz"; then...
test 传回判断式结果(0真,1假)
[判断式]
if ["str" \> "xyz"]; then...
command1 && command2 ,[判断式] && command
(执行1成功后,才会执行2)
command1 || command2 (执行1假,才执行2)
&&与|| 结合使用:
[判断式] && command1 || command2
解释:
文件属性判断式:195~
-a文件存在 -d目录存在 -e 文件存在
...
字符串的条件判断式:
-z 字符串(字符串长度为0)
-n 字符串(长度不为0)
if[str1 \> str2]
if[[str1 \> str2]]
算式条件判断式:
[参数1 -eq 参数2]
-ne 不等于
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
Bash选项的条件判断式:-o
if[-o history];then...
for:
for 变量 in 串行
do
...
done
例如,
for i in $@
do
echo $i
done
for((初始;条件;异动项))
do
...
done
for无穷循环:
for((;1;))
case条件判断:
...(9章5节)
while 条件测试
do
...
done
while无穷循环:
while((1))
while true
while :
until 条件测试(测假值)
do
...
done
until无穷循环:
until((0))
until false
select建立简易的列表:
select f in 变量
do
...
done
break和continue
第10章 函数(ok)
定义:
function name(){}
name(){}
function name{}
调用:
name
name 参数1 参数2 参数3...
取消函数定义:unset -f function_name
传递函数给子SHELL环境使用:export -f function_name
$0 script文件名
$1 第一个参数
...
${10} 第10个参数
${11}
$# 参数个数
$@ 所有参数
$* 所有参数
往前移动参数的值:shift n
建立函数库:
mylib.sh
_functionName
_variable
调用函数库:
. path/mylib.sh
source path/mylib.sh
递归函数
第11章 转向
文件代码:操作系统赋予已开启文件一个编号(0开始),作为追踪文件之用
系统默认的文件代码:0标准输入 1标准输出 3标准错误
< 转向输入
> 转向输出
开启文件:fd <> file 可供读写
exec 6 <> test.txt
exec 转向操作生效 exec < file 由标准输入读取的改向file读取
关闭转向输入文件:fd <-&
例如 exec 6<-&
关系转向输出文件:fd >-&
例如 exec 6>-&
复制代码:要操作系统已开启的文件代码(0 1 2),为了不影响原有文件代码的作用,最好先复制一份,操作完毕后再还回去
n<&m 复制转向输入的文件代码m,存成文件代码n,使n连接至m
n>&m 复制转向输出的文件代码m,存成文件代码n,使n连接至m
例子:
exec >&6 将标准输出连接到文件代码6 等于 exec 1>&6
cat <&6 将文件代码6的内容转向标准输入,cat 将标准输入显示
exec 6<&0 将标准输入转向到文件代码6
exec 5<&0 做标准输入的备份
exec 0<&5 5<-& 还原标准输入并关闭文件代码5(分成两段写,exec 0<&5 exec 5<-&)
转向输入:fd<文件
例子:
wc -l < /var/log/apache2/error.log
exec 6</var/log/apache2/error.log
wc -l <&6
转向输出:fd>文件(如果文件不存在则创建,存在则被清空)
>text.txt 创建空文件
:text.txt 创建空文件
:为空命令
ls > text.txt
exec 6>out.txt
echo "hello" 1>&6
fd>|file 只要文件存在,都强制覆盖清空文件内容
比较:fd>file
fd>>file 转向附加
&>file
>&file
标准错误伴随标准输出做转向
相同于:>file 2>&1
Here Document转向
fd<<标记
...
...
标记
exec 6<<EOF
line
line
line
EOF
while read <&6
do
...
第12章 trap--陷阱触发
trap(陷阱触发):捕捉特定信息,并做出反应的机制
列出进程:ps auxw,ps -ef
列出系统定义的信号:kill -l,trap -l
重新启动:
kill -1 pid
kill -HUP pid
kill -SIGHUP pid
查看信号定义:man 7 signal
kill -信号 pid
kill -s 信号 pid
kill -n 信号 pid
kill pid(-TERM 默认) 终止进程但未必能终止
kill -9 pid,kill -KILL pid(强制终止进程)
killall -信号 进程名称(kill与killall区别)
trap:陷阱触发
第13章 sed与awk
正则表达式:
. 一个字符
^ 开头(例如 ^Jack)
$ 结尾(例如 123$)
[...] 一个字符(例如 [a-z])
[^a-z] 除了小写 (^在[]里代表除了)
* 0个以上
\{...\} 指定符合的个数(例如 [a-z]\{3,5\)
\(...\) 暂时保存符合的字符串 ( H\(...\)y )
--sed--
非交互式流编辑器,可动态编辑文件
sed处理的对象是文件的数据流(stream)
工作模式:比对每一行,若符合样式,执行操作
sed --version
sed '样式命令' 文件
例如,
sed '1,4d' file1 (, 从-到。删除1-4行,显示剩下的行)
sed '/La/d' file2 (删除含有La的行,显示剩下的行)
sed '/^$/d' file3 (删除空行,显示剩下的行)
sed '/La/!d' file4 (删除不含有La的行,其他显示)
sed '/La/p' file5 (显示含La的行,不符合的也显示)
sed -n '/La/p' file6 (显示含La的行,-n抑制不符合的行)
取代:sed -n 's/La/Oo/p' file7 (取代每行La为Oo,并显示。s///p为取代显示,但只取代一个)
全局取代:sed -n 's/La/Oo/pg' file7 (g为全局命令,取代全部)
sed -n 's/La//p' file8 (删除每行含有第一个La,并抑制显示不含La的行)
sed 's/^...//p' file9 (删除每行头3个字符)
sed -n '/AAA/s/234/567/p' file10 (含有AAA行,将234换成567,其他行不显示)
sed -n '/AAA/,/DDD/s/B/234/p' file11 (找到含AAA-DDD的行,将B换成234)
sed -n '2,4s/B/234/p' file12 (2-4行中B换成234,其他行不显示)
--awk--
处理数据,产生格式化报表的语言
工作方式:读取文件,每行是一条记录,每个记录分成若干字段,然后输出字段的值
awk "样式" file 显示符合样式的行
awk {操作} file 对每一行执行{}的操作
例如,
awk '/La/' file1 (显示file1中每行含有La的行)
awk {print $1,$2} file2 (显示file2中第一二字段)
awk '/La/{print $1,$2}' file3 (显示含有La的数据行的第一二字段)
awk -F: '/^ols/{print $3,$4}' /etc/passwd (-F: 以:为记录的每个字段分隔符)