您的位置:首页 > 运维架构 > Shell

实战Linux Shell 编程与服务器管理

2013-10-18 17:21 302 查看


实战Linux Shell 编程与服务器管理



 

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: 以:为记录的每个字段分隔符)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: