《Linux Shell 编程艺术》笔记

第一章:Shell介绍和脚本基础

1.系统登录: 

Alt+Ctrl+Fn(n-1~7)

2.查询当前正在使用的Shell:

echo $SHELL

3.创建一个进程的方法:

通过fork()系统调用创建子进程

然后在子进程中通过调用系统调用execve()执行一个可执行的程序,父进程就是Shell。

4.Linux系统中有两类命令:外部命令和内建命令

      内建命令会被优先执行,当一个命令既是内建命令又是外部命令时,通过指定路径                    即可使用外部命令。

查询所属命令是外部命令还是内部命令可用type命令,即type -a 命令名。

5.退出Shell的方法:

Ctrl+D  或者在命令行下输入exit/logout

注意在模拟终端下不能使用logout。

6.复杂命令的简化:

      history命令查看之前执行过的命令

      !!执行上一个命令。

      上下键。

通过history命令获取之前命令的编号,再  通过使用!+编号即可重复执行某一命令

7.自定义shell:

使用内建命令 alias, 用法:alias  新名="旧名"

查看新名所表示的旧名   alias 新名 即可。

通过使用unalias name 即可取消别名name 的定义。

8.命令行的提示符:

       内建变量PS1  PS2

       查看内建变量   $PS1   $PS2

       通过修改PS1 PS2的值来修改提示的内容。

9.非标准程序目录:

修改path路径。

    显示path路径    echo $PATH

    添加修改path路径   export PATH‘目标路径: ${PATH}'

path中每个路径通过冒号分隔,在第一条路径搜索到可执行文件时,结束后面的 搜索,往后如此。

10.获取帮助:

通过内建命令help来获取bash帮助。

12.shell编程注意:

 每个命令占一行,若要一行多条命令,分号隔离。

shell程序运行的两种方式:source+文件完整名,另一种就是前面所讲的方法。

不创建新进程。

一般在文件头加上 #!/bin/bash

13.shell运行方式的区别:

通过内建命令运行的shell不创建子进程,其他则是通过父进程创建子进程来执行shell

第二章:操作文件和目录

1.在Linux中一切都可以被看作为文件。

ls命令,查看当前目录下的所有文件。

cd命令  -L链接路径  -P真正路径  单独加一个 -  表示返回上一个路径,不是上一层路径

dirname命令 保留路径 删除文件名

basename命令 保留文件名  删除路径

tree命令   默认情况下没有安装tree命令,使用sudo apt-get install tree 

安装tree。

more命令和less命令:查看文件内容太多的文件,使用方法同vi 两者的区别在于

more只能通过空格键一直向下翻页,直到结束,而less看可以通过Page On/Page Down/来控制上下翻页,按Q键即可退出。

    查看文件的前5行   head命令  head -n 5 文件名

查看文件的后5行  tail命令    tail -n 5 文件名

      在没有指定的情况下,默认显示10行,

同时两个命令可以显示前后若干个字符,将-n改-c即可。

2.统计文件行数和字数:

wc命令:  wc   文件名

结果显示依次是   行数 字数  字节数  路径

也可以同时使用多个文件,wc命令会依次统计每个文件的信息,并且在最后一行做一个统计。

mv命令常用来更改文件名。

cp命令  -L  直接复制链接所指向的文件, -P  赋值链接文件。

chown命令  修改文件所有者   使用root权限 sudo chown 新的文件所有者:文件pathname

只修改所有组  sudo chown :新的所属群组 文件pathname

      passwd命令 修改密码。

第三章:输入输出重定向和管道

1.在Shell中输出的重定向:

格式:  command > 文件pathname  表示将命令执行后的结果输出到某一个文件中。

注意点:每一次将一条命令的输出结果写到一个文件当中去的时候,就会导致之间的内容被覆盖,可在后面加上-C强制输出文件列表。

可使用 >> 重定向操作符  向文件后面追加内容而不覆盖之前的内容。

2.Shell中输入的重定向:

   此处遇到一些问题。

3.Shell中的标准错误的重定向:

文件描述符为 2

将标准输出和标准错误放到不同的文件中。

语法格式:command 1>>标准输出文件 2>标准错误文件

将标准输出和标准错误放到同一个文件当中去

      语法格式  command 1>标准输出文件 2>&1

或者      command 2>标准错误文件 1>&2

不想让标准输出错误出现在终端,也不想让其出现在文件之中。

解决方法:将数据丢到   /dev/null中去

      command  2> ~/dev/null

如果连标准输出的数据也不想看到,同样也可以将标准输出的数据丢到~/dev/null当中去

注意的地方是  2>&  是一个整体。

      4.管道

语法格式:

command1|command2|command3|.....|command n

      将command1的输出作为command2的输入,将command2的输出作为command3的输入,依次类推。

      程序的输入和命令行的参数是两个不同的概念。

举例: 在命令行下   rm -i `find -name ‘*.txt'`会删除当前目录下的所有txt类型的文件。这是参数

      在命令行下  cat a.txt |while read oneline  这是输入。

管道的关联  exec指令

5.块语句的输出和重定向。

所谓块语句 就是  if语句    for语句  while语句  until语句  case语句

将一行命令的输出都进行重定向:

将所有命令使用花括号括起来就可以进行块语句的重定向。

要注意的是Shell编程当中的符号与关键词之间要有一个空格。

标准格式:

{  command1 ; command2 ;command 3;command 4;}>>  标准输出为文件

另外的一种方式便是用()来代替花括号,放在Shell的子Shell当中去运行。

      技巧   打印当前的进程ID   echo $$

    打印当前的进程ID以及父进程的ID。

关于Shell当中的父进程与子进程之间的关系。

分析以下代码;

在一个Shell脚本当中写下以下代码:

#!/bin/bash

read S

echo $S

      然后在Shell下执行该Shell脚本

      输入25   打印出25

      再次在Shell下输入 echo $S  打印出空值

???

代码分析:

用户登录到Shell当中时会启动一个Shell  在这个最初的Shell当中,

可以执行Shell命令和声明变量,也可以运行Shell脚本命令,Shell执

行外部命令或者执行脚本文件时会创建一个字Shell,然后再子shell当

中执行此shell脚本,一旦子shell执行完毕,返回到父shell当中,但

不会影响父shell原来的环境,这就解释了在父shell当中为甚什么输出

空值

解决的办法:

一:在当前的shell当中执行脚本。

格式如下: ../shell文件  或者   source ./shell文件

二:通过变量回调。

      代码实现:读取用户指定的文本文件,然后输出到指定的文件当中去。

代码见  home/xyxk/My/Bash/Bash1/ReadandOut.sh

注意:不要遗漏花括号的两侧的空格。

不要遗漏语句块的左后一个命令的空格。

Here  Document

   功能:存储一些临时数据

使用IO重定向的形式记录了一段临时的文本或交互的命令,并把这些文本或者命令依次传递给一个程序或一个命令,作为他们运行的标准输入。

语法格式: command<<标识符

>document

>document

>document

>document

...

>标识符

举例: cat <<here 

>2516

>15161

>14516

>0513

>156315

>135178

>130474

 >here

屏幕上便会打印出这段文字。

文件描述符:

介绍略:

需求:

将一个脚本文件中的输出数据导入不同的文件。

      使用技巧:

      在脚本文件中   将数据发送到重定向文件  >&n

在执行脚本文件的时候   指明文件描述符所指向的文件

文件描述符的关联;

使用方法:

标准输出重定向

exec fd > 标准输出文件

还可以使用文件描述符关联文件描述符

例如   exec  5>&4;

用文件描述符5关联文件描述符4所指向的文件。

同理可使用标准输入重定向

exec fd<标准输入文件

同时可以使用文件描述符将一个文件定义为便准输出文件和标准文件

格式如下:

exec fd<>标准输入输出文件

关闭文件描述符

exec  fd <(>)&-

     第四章  进程 

1.查看进程。

ps命令 

选项:-e 列出系统中的所有进程。  -f 用完整的格式显示所有的进程信息

完整的进程信息:

UID:进程的所有者

PID:进程在系统中的唯一标识号

PPID:父进程的进程ID

C:粗略的记录每个进程所占用CPU的时间

STIME:记录了进程启动的时间

TTY:当前进程所运行在的终端

TIME:进程所消耗的系统CPU时间

CMID:完整的程序路径和参数

2.筛选出我们所关心的进程

指定关联的终端  -t

例如:  ps -ft /dev/pts/1

也可指定多个终端 

显示第一个启动的终端。

3.查询指定的PID进程

ps -fp Number

也可同时指定多个Number

4.查看某个用户所运行的进程

ps -fu UID或者用户名

也可以查看多个用户所运行的进程

5.进程树的查看

pstree 命令

-a  显示命令行参数

-h  高亮显示当前进程和子进程

-H  高亮显示指定进程

-p  同时显示PID 

还可以为pstree指定一个PID参数作为显示进程树的起点

6.前台进程和后台进程

前台进程:

默认情况下在命令提示符下执行的命令和脚本都是前台进程

终端在一个时间内只能执行一个进程。

后台进程:

运行的过程中不占用终端提示符。

1.将某一命令放在后台运行,而不是终端。

       通常是在命令后加上   &符号表示不在终端执行。

2.查看后台运行的进程

使用jobs命令

有关后台进程现实的信息解释

     [1]4645 

       1表示任务号  Shell会为每一个在后台运行的程序建立一个任务号

       当进程任务号出现+或者-号时,+表示当前进程是最后一个运行的进程,-表示

当前进程是倒数第二个运行的。

       后台进程的状态   Running  正在运行

   Stopped  已经停止

   Exit     后台进程出现错误,退出状态

当后台进程结束时,shell会通知我们是哪一个后台进程结束了。

注意  命令jobs和命令ps的区别 

jobs命令只显示命令所在终端的后台进程

ps命令则显示所有终端下的所有进程

3.将一个后台进程重新调度回前台。

             利用Bash的内建命令  fg

       代码示例: 

 cat - &//将cat命令加入到后台进程

由于cat命令等待用户输入,因此处于挂起状态

通过fg命令将cat调回到前台   fg %Number

Number为cat所处于的任务号。

4.将一个前台程序放回到后台

使用bg(background)命令

例如:

执行前台进程   make

前台进程会占据终端,等待用户。

ctrl+Z将进程挂起

      使用   bg %任务号将前台进程移动到后台进程

使用stty命令查看自己终端配置

移动到后台的进程还可以再次被移动到前台。

5.后台进程没有完成的情况下,终端突然关闭,导致进程自动被杀死,

       使用nohup命令  

   保护后台进程在终端退出时不被杀死。

有关nohup命令使用的几点注意:

在当前终端的进程会被Init进程接管

       后台进程的标准输出会被重定向到   nohop.out文件中,标准错误会被

重定向到标准输出,标准输入会被重定向到/dev/null

后台进程在终端关闭之后,不再关联到任何一个终端。

一定要把&放在最后

6.终止进程的运行

使用内建命令kill

       使用方法  kill %任务号   或者 kill 进程PID

      kill命令只能杀死这个普通用户自己所创建的进程,无法杀死其他用户的进程

killall命令  杀死一类进程

     ctrl+c 命令终止当前的进程

     有关状态值的说法:   echo $?

     在终止一个进程的时候,通过上述命令查看状态值然后再利用Kill -l  状态值

   来查看是哪一类信号导致了进程的终止

7./proc/文件系统

该文件系统是一个虚拟的文件系统,该目录下的文件不会占用磁盘空间,通过该系统可以了解系统的硬件信息

首先通过  echo $$查看当前终端shell的PID

       然后在proc对应的子文件下找到相应的文件

      该文件下显示的是当前shell的所有子进程

第五章:文本处理和字符串操作

   1. ls 命令  -t -u  根据文件的访问时间来对文件列表进行排序

代码示例:ls -lut |grep "-" |head -5|cut -c41-

   ls    -l  显示文件列表   -u  显示文件的最后访问时间 -t  根据访问时间来排序

grep "^-"筛选出那些一 -  开头的普通文件  

head -5  提取出前5个文件 cut -c41- 剪辑保留第41个字符之后的内容

   2. paste 命令  将两个不同的文本文件之间的内容连接起来。、

   代码: paste -d '-'  文件A  文件B |cat -n  同时显示

   还可以将多个文件链接起来 

   代码:  paste -d '-'  文件A  文件B |paste -d '-' -  文件C |cat -n

   并且显示出来

3.统计当前的Shell程序被多少用户使用,并把统计结果按照从大到小的顺序排列。

代码”:  cat  /etc/passwd |cut -d : -f7|sort|uniq -c|sort -nr

 cat  显示文件

cat的输出  作为cut的输入  指定分隔符为 :-f7  从文件的第七个字段开始

sort整理/uniq 统计/sort将uniq 的结果再次整理。

4.统计文本中各个单词出现的次数

uniq命令:

从标准输入中读取数据,对多个相邻的行的数据进行合并,然后将合并的结果送到标准输出。

-c   统计相同的行的重复次数,即使不相邻也会统计。

tr命令: 转换或者删除输入数据中的字符  

第六章:变量

1.普通变量

基本语法格式:  NAME=Value

变量没有类型

变量中无论存放什么都是字符串

注意: 变量定义语句的等号两侧不能有空格

变量的命名规则:只能是大写字母,小写字母,数字,或者下划线,不能以数字开头

除此之外的一切字符都在shell算作关键词和特殊字符。

命令替换和变量替换

可以使用一个之前未被定义过的变量,只不过是一个空字符串。

2.输入变量的赋值和删除定义过的变量

read命令 unset命令

read -p 请求输入变量的同时输出一些提示语句到标准输出

后面也可接多个变量的值请求输入   以空格为分隔符

unset 变量名  删除某个定义过的变量

注意:在双引号内再次引用字符串的时候不再使用双引号而是使用单引号

判断某个变量是否为零/判断为空

if [ -z $NAME ]

3.变量的只读只写

readonly 关键词

使用方法:  readonly 变量名   在定义变量的时候修饰或者在变量定义之后再次修饰

若在程序中试图修改只读变量的值,进程会报错

同时也无法清空只读变量 

4.数组变量

shell当中的数组:

元素的地址从0开始

数组元素的赋值:  array[index]=value

不需要为数组的每一个元素赋值,没有赋值的元素是一个空值   

为数组中的元素一起赋值:

array=( value0 value1 value2 value3 ....)

没有指明序列号的情况下 依次从第0个元素开始赋值

还可以不用按照顺序赋值:

array=( [2]=value2[0]value1[3]=value4)

还可以这样:

array=( [2]=value1 value2 value3 )把value1的值赋值给array[2]后,后面自动按照序号赋值

数组元素的值打印:

整体一起打印出来

echo "${array[*]}"

分别打印出来

echo ${array[*]}//重要

引用数组元素需要在$后面打上一个{}

在整体引用一个数组的元素时,没有被赋值过的数组元素不会出现。

如果对数组中的多个元素重新赋值,原有的所有值都会消失。

数组也可以定义为只读,格式同定义变量一样。

数组的删除操作:

删除某一个元素:

unset array[n]

删除一个数组:

unset array

unset array[@]

unset array[*]

5.变量的属性:

本地变量:只能运行在某一个shell进程之中。

环境变量:在创建子进程的过程中可以创建父进程中环境变量的副本。

环境变量的创建:                                //复习

export 命令  

export 变量名   这样子进程就能使用父进程的变量

注意:改变子进程的环境变量的值不能改变父进程中环境变量的值。

介绍一种高级的变量替换:

${变量名:-字符串}

在引用变量的时候,如果变量没有定义过,就用字符串来代替

以下的if结构的解释:

if[ "$1"="字符串"]

检测标准输入   使用时一定要注意的是  前面要加上所造文件的名字

6.Shell变量

shell在启动的时候,会初始化一些特定的变量,这些变量的值与shell的

运行息息相关,Shell变量的值名字应该都是大写字母

常见的shell变量:

HOME           当前用户的主目录

SHELL          当前用户所使用的shell程序

USER           当前的登录用户名

UID            扩张当前的用户数字的user id

BASH_VERSION   当前的shell版本

PWD            当前的工作目录

OLDPWD         前一个工作目录

SECONDS   当前shell运行所花的时间

SHLVL     当前的bash进程是shell登录进程的第几层进程

RANDOM         产生0-32767之间的随机数

PATH           系统命令或外部命令的存放路径

两个常用的命令

set 查看当前shell中的所有变量和函数定义

env 查看所有被export导出的环境中的变量

7.特殊变量

具有特殊功能的变量,由shell创建只能由shell修改

特殊变量当中的位置变量

处理参数固定的:

参数分别是:

$1:查询当前命令行是否指定参数

if [ -n $1 ]检查位置变量是否为空

$0:输出文件本身的文件名

代码见:home/xyxk/My/Bash/Bash6/Test6.sh

注意的是  有时候写文件的路径时,一定要加上当前路径./

处理参数不固定的:

1.

通过使用特殊变量$#:

检查参数是否为空:

if [ $# -eq 0 ]

while [ $# -gt 0 ]

只要参数还要文件的话

shift  删除当前文件参数,替换为下一个文件参数

具体代码详见Bash6下的Test7.sh

2.使用$@和$*可以获得完整的参数列表

echo "$*"即可打印出当前完整路径

第七章:流程控制

1.*****if else 结构*******

见 Bash7 Test2.sh

通过$# 和if else 结构检查命令行参数的正确性

if  else 结构1

if [ ]

then

elif [ ]

then

.....

fi

exit 0

注意:在Linux/Unix中  函数或者语句的退出状态为0的话,

意味着执行成功,反之执行失败。

常见的二元操作符有;

操作符       含义

-eq          等于

-ne          不等于

-le          小于等于

-gt          大于

-ge          大于等于

注意:二元操作符的要求:

两边不能是浮点数,可以是正整数,负整数

实战:通过用if else结构写一个应用程序的安装脚本

Test3.sh

注意  不要漏掉fi这句最后的话

2.***************case 语句*****************

积累:

clear语句:清除屏幕

case语句的标准格式:

case 关键词  in

Judge One)

Operation One

;;

Judge Two)

Operation Two

;;

.......

*)//这里表示不符合情况的其他情况

    Operation Other

esac

需要注意的是:

不要遗漏分号

不要遗漏esac

以;;结尾的话  程序运行到满足条件的case语句

之后停止,以;&或者;;&结尾的话则继续执行

具体操作见Test4.sh

3.*************while 循环********************

while语句的标准结构:

while [ 判断条件 ]

do 

      执行命令

done

积累:  if [ $? -eq 0]

上述语句可以用来判断上一条命令是否执行成功,检查一条命令的

退出状态,若为0则执行成功,反之执行失败。

注意的是:while语句的测试条件可以是多条命令,决定是否退出循环体的

条件是最后一条命令的返回值

具体代码见Test5.sh

4.******************until循环

标准格式:

until [判断条件  不成立就执行]//一旦成立就结束

do

执行语句

done

注意:在这里写程序的时候犯了一个巨大的错误,等号用于比较的时候

两端要有空格

5.**************for 语句*********************

标准格式:

for name in word1 word2  word3

do

语句体

done

name为变量的名字,扩展in为空格分隔的列表

每一次循环的过程当中,name会依次取后面的值,

直到最后一个值结束

还可这样使用:将命令行的参数作为循环的值

for param 

do

语句体

done

对于每一个参数都会执行语句体

当循环退出时,以for循环的最后一个命令为循环的退出

状态值

同时:shell为方便C语言开发者编写shell程序

有如下的for循环结构

for((i=0;i<100;i++))

改成了(())双括号

具体代码见Test7.sh   Test701.sh

*****************select循环*********************

标准格式:

select name [in words] 

do

      语句体

done

注意的是:

可以加判断语句

用法同for语句差不多

in words 后面也可以接受命令行参数

**********break语句与continue语句**************

用法同C语言

第八章:替换

1.getopts 命令

标准格式: getopts string name 

举例:  getopts f:e:p

依次将string的字符 复制给name  其中字符串string中以:或者空格号结尾

其次是将相关选项后的参数复制给一个getopts的特殊变量OPTARG

常用于while判断中

2.转义字符的使用   

\转义字符   将转义字符变为普通的变量

3.内建变量   REPLY 默认将标准输入的值放在这个变量当中

4.if语句中

判断一个字符串是否为空时,经常使用  -z   判断一个文件是否是可写 -w 

判断一个字符串是否是地址   -d  选项 

判断一个文件是否可读 使用-r

5.系统休眠  sleep n

休眠 n 秒

6.高级形式的三种变量替换:

${var: -value}:

如果变量没有定义过或为空,就用value来代替  但不修改var的原有值。

${var: +value}:

如果变量不为空,就用value来代替  但不修改var的原有值。

${var: =value}:

如果变量没有定义过或为空,就用value的值赋值给他。

${var:?msg}:

如果变量为空,那么打印msg到标注错误输出并且退出脚本。

6.高级变量同样可以被普通的语句所替换

如:${EDITOR: -vim} "$TARFET_FILE"   使用指定的编译器的

打开目标文件

可用如下命令代替:

[-z "$EDITOR"] && vim  TARGET_FILE

如果editor为空,则返回真,此时执行后面的语句,用默认的vim编辑器

打开该文件

7.文件名替换

使用通配符:

如显示所有文件  ls *

显示文件名以 字母a 或者字母b 其实的文件   ls [ab]*

显示文件名不以 字母a 或者字母b 其实的文件   ls [^ab]*  或者  ls [!ab]*

显示所有以.txt  结束的文件名     ls *.txt

显示文件名 以字母a-c起始的地址   ls [a-c]*

显示文件名 以数字1-5起始的地址   ls [1-4]*

显示所有字母a-z 1-9起始的地址    ls [a-z1-9]

注意:

通配符默认只会匹配可见的文件,如果想匹配不可见的文件,需要明确指明第一个字符是点。

8.命令替换

讲一个命令参数的输出作为其他命令的参数

如打印出当前的年月日

echo "$(date '+%Y%m%d')"

把一个命令的标准输出赋值给一个变量

变量名=$(commands)或者`commands`

commands 可以是一个命令  也可以是多个命令  也可以是由管道连接起来的多个命令

8.算术运算替换

let  命令的使用

注意 在算术表达式中使用变量可以不用操作符

Let命令不能容忍有空格

expr命令  

算术替换 $(())在表达式中可以使用任意的空格 并且支持逻辑操作

如  $((3>2))的值为1

需要注意是   算术替换只能做整数运算  结果中的小数都会被忽略

遇到不懂得问题多百度

第九章:引用

Shell在遇到  * ?时,会进行文件名扩展

在遇到 ` 时会进行命令替换

在遇到 $ 时会进行变量替换

注意在这里编程遇到一个错误提示

以下语句:

if  [ $First_Num -gt $Second_Num ]

在这里编译器会报错  为了防止两者变量含空   改成如下格式

if  [[ $First_Num -gt $Second_Num ]]

也可用  >   <   代替

1.使用反斜杠

文本名:  \<\< \>\>  小于\<  大于\> 

Linux常见的关键词:

关键词           含义

~                用户的主目录

`                命令替换

#                注释

$                变量引用

&                把任务放到后台执行

*                通配符,代表任意个任意字符

?               通配符,代表一个任意字符

()               在子shell中执行

\                引用后面的一个字符

|                管道

[]               指定一个字符集的通配符

{}               创建一个命令块

;                命令分隔符

‘ ’              单引号引用字符

“ ”              双引号引用字符  

>                标准输出重定向

<                标准输入重定向

删除某一特定的带特殊字符的文件:

rm   temp\*.txt

在删除含有通配符的文件是,只有在目录不存在能够成功匹配模式的文件时,才可以直接使用通配符

2.使用单引号

直接对一串字符串使用单引号,那么单引号所包含的特殊字符立即失去作用,变成一个普通的字符

也可以一个字符使用单引号。   

注意:若包含的字符串中含有单引号可以使用反斜杠来输出单引号

3.双引号的使用   使用双引号的注意:

对$不起作用

单引号会使所有的特殊字符失去意义

双引号保留命令替换和变量替换

双引号中使用 \ 防止变量进行替换

举例:   echo  "The Price is $4000.0"

为了防止$4位置变量,使用如下方法   \$4000.0

使用双引号可以会把一个含有空格的字符串当成一个整体

如果一个字符串含有双引号,则使用反斜杠来引用双斜杠

在双引号的作用下 特殊字符的作用仍然存在的:  $   `  "  "   \

4.引用的其他应用

使用\ 在结尾能够构成一个多行的命令

也可使用双引号提示命令还未输入完整

第十章:函数

shell当中的函数特点:

可以指定参数,函数也有返回值

1.函数的定义

name()

function name()    括号可以省略

2.函数的调用

直接写出函数名来就可以、

注意:脚本中的函数在当前进程之下,而不会去重新创建一个新进程。

定义函数时,函数体不能为空。

3.在命令行下写函数

函数名()

然后按enter键

在终端下查询查询自己建立的函数

declare -f  函数名   即可看到自己的函数定义

只能在定义的终端内查询

4.取消函数的定义

unset

5.函数的输入参数

直接在调用函数后面加上参数

若所加参数过多的话记住在程序里面通过使用shift 和while命令

6.函数的输出参数

使用return语句返回函数的状态

1   错误的状态

0   正确的状态

exit 命令退出脚本的执行

return命令结束函数的运行

知识点:

tr命令   将某一字符转化为另外一个字符

第十一章   其他常用工具

file命令可以准确找出文件的信息

数据备份

数据的压缩和解压缩、

压缩工具:

xz bzip  bzip2

区别在于背后的压缩算法不一样,

bzip2 [options][filenames]  可以一次压缩多个文件

同时如果存在相同的文件名,则系统会提示压缩文件已存在,并以状态1退出

如果希望系统覆盖原有的压缩文件则 -f

解压缩后的文件属性 修改时间 所有者不会改变

-v   显示压缩的详细信息

当用bzip2压缩文件时,如果希望保留原来的输入文件  -k(keep)

解压缩工具:

bzip2对应的解压缩工具bunzip2

使用格式   bunzip2   压缩文件包

压缩过后会直接删除压缩包,-k保留压缩包  如果路径中含有相同的文件名  系统会提示  

除非使用 -f选项

在不解压之前查看文本文档的内容

bzcat  bzmore bzless

文件备份:

tar工具   打包以后的工具叫做 tarball

打包格式   tar -cvf  打包名

解包格式   tar -xvf  要解的包名

打包只是方便文件传输,打包后的文件数据容量会变大

也可以在打包的同时压缩文件  只需再添加选项  -j   bzip2   -z  gzip   -J xz即可

下载工具

wget和curl文件

 

第十二章处理信号

常见的信号

1)SIGHUP2)SIGINT3)SIGQUIT4)SIGILL15)SIGTERM

1.通过kill发送信号给进程

格式:

kill  [-s  信号名| -n  信号数字 |信号名][信号的PID|信号的任务号] 

如果没有指定信号名或者信号数字  默认发送 SIGTERM 信号 终止进程的运行

信号的回调函数

*****多个信号共用一个处理函数

trap   函数/command  信号名|信号数字    次数相当于函数的注册

函数并没有执行,只有在发送信号的时候,才执行函数。

在向进程发送信号的过程中,会执行上述函数。

*****单个信号处理一个单独的信号

同上  trap  command   信号数字|完整名称

*****信号数字名称为0的伪信号:

脚本在退出之前,会产生一个伪信号,通过为这个伪信号注册回调函数,

便可以在信号结束之前做一些事情。

*****忽略信号

只需要在指定的信号函数指定为空时,就可以忽略该信号

如  trap '' 命令   即可将命令忽略

****在忽略信号之后希望重新使用给信号,比如不希望Ctrl+C按键打断某些重要操作

,但是希望打断某些普通操作的时候。

简单   只需要程序在合适的时候再次为该信号注册其他的回调函数就行。

*****定时器

几个知识点:

一:杀死一个进程   kill  进程名

杀死一个进程的父进程   kill `pgrep -P "父进程名"  杀死以父进程父进程的进程名。

存储当前的进程名 $!

第十三章   使用sed处理文本

sed是一款流编辑器,可以批量对数据进行处理。

sed命令的一般格式:/pattern/action/

Action    

p  打印行

d删除行

s用一个新的表达式替换一个旧的表达式

sed可以一次处理多个数据,只需要通过分好隔开就行

举例:

sed 's/jerry@qq.com/emma@qq.com/g' "$file"  > "$file.$$"

替换操作s的一般格式为:

s/pattern2/pattern3/

或者

pattern1/s/pattern2/pattern3

上一个命令没有pattern1,表示sed会对每一行数据进行处理。

最后面的符号g表示,是全局变量的意思,sed默认对一个匹配pattern2的

字符串进行匹配,如果希望多个被匹配,则需要在后面加上变量符号g

$file 告诉sed要操作的对象

$file.$$  特殊变量$$会创建一个临时文件,他会被扩展为当前的

shell,并且在没有指定到-n的情况下,然后会用临时文件覆盖这个

文件。

通过;连接多个命令

sed 's/25478/31446/g';s/25478/254787/' "$file"   >"file.$$"

也可以使用-e 选项指定编辑多个命令

例如:

sed 's/pattern1/pattern2/g' -e's/pattern3/pattern4/g'

可以通过把sed命令编写成一个文件就可以多次执行编辑命令

然后使用-f命令调用文件,例如:

sed -f 命令文件名 "修改文件名"  重定向文件名

如果希望之星修改命令时不区分字母大小写,同字母g一样可以在后面

加上或者I 

例如  sed 's/pattern1/pattern2/gi' "file"  >> "file.$$"

常见修饰符:

-p 如果匹配成功  打印模式空间   

num指定替换第num个字符

w filename 如果匹配成功,把结果写到filename当中去

字符的转移,如果在pattern含有/之类的字符时,可能无法成功实现匹配

可以使用\实现禁止shell扩展

实现上述功能的第二种方法便是改变分隔符 以:来代替/就行。

重要提示:

不要把sed命令的结果重定向到原始文件

sed在不加全局变量的情况之下会默认只替换第一行的第一个匹配字符串。

****************选择要指定操作的行

可以在命令前指定要执行的行 ’2p'  打印第二行

'3,25d'删除3~25行

还可以使用 '3,+3d'删除第三行及后三行的数据

*****************操作相隔的行

可以使用分号执行多次编辑命令。

也可以使用以下方式:‘3,26!p’。

删除除了3-26行以外的行。

*****操作步进的行

基本格式num1~num2

删除num1行以及之后每次自增num2的所有行

*****删除行号不清楚的行或者其他特殊行

删除注释行:'/^#/d'

删除空行:   '/^s/d'

***************锁定以数字结尾的行

’/[]$p'$表示所匹配行在结束之前有一个数字。

[a-z]  匹配小写字母

[A-Z]  匹配大写字母

[a-zA-Z]匹配大写字母

....依次叠加

使用正则表达式来操作

上述行号操作,略。

第十四章   使用awk处理文本

第十五章   grep和高级正则表达式

第十六章   debug  shell

转载于:https://www.cnblogs.com/xiaoqi254789/articles/6832811.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值