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

实战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: 以:为记录的每个字段分隔符)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值