39
5 Shell 脚本及应用

第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

第 5 章 Shell脚本及应用

Page 2: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

1.vim简介

vim下三种操作模式:

Normal Mode

Insert Mode

Ed Mode

Page 3: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

Normal Mode(默认模式 )

左 /右 /上 / 下键: 光标向左右上下移动

数字 +左 /右 /上 / 下键: 光标向左右上下移动数字指定的行/列数

0 : 光标移动到这一行的最前面字符处

$ : 光标移动到这一行的最后面字符处

gg : 移动到文件的第一行

G : 移动到文件的最后一行

dd : 删除光标所在的那一整行

ndd : n为数字,从光标位置开始,删除向下 n行。

Page 4: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

Insert Modei:在当前光标所在处输入文字

Ed Mode

:w 将编辑的数据写入硬盘文件中

:w! 强制写入该文件

:q 退出

:q! 若修改过该文件,又不想保存,可用该命令强制退出,

且不保存修改

:w [文件名 ] 将编辑的数据存储为另一个文件

:n1,n2 w [文件名 ] 将 n1到 n2行的内容写入到新的文件中

Page 5: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端
Page 6: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

用户

应用程序 Shell

内核

硬件

用户2.Shell基础设置

Shell: 壳

linux:kernel(核 )

Page 7: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

• shell 是用户和系统内核之间的接口程序• shell 是命令解释器• 在本章中, shell指 linux的终端即解释用户命令和 shell程序的文字终端

硬件

其它用户界面 用户

Shell

操作系统

图形界面

Shell是一个特殊的应用程序,用户一登录成功,就被调入内存

Page 8: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

——交互模式 直接执行命令

——非交互模式 读取存放在文件中的命令

常用 Shell:

Bourne Shell (sh)

C Shell (csh)

执行效率有点差,多用于交互

Korn Shell (Bourne Shell超集 ) (ksh) 集合了 C shell 和 Bourne shell 的优点 并且和 Bourne shell 完全兼容

Bourne-Again Shell (Bourne shell 的扩展 ) (bash)

bash 与 Bourne shell 完全向后兼容,也包含了很多C shell 和 Korn shell 里的优点。

Page 9: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

Shell学习什么?

Shell命令

Shell的命令集成

Shell的配置文件

Shell用户环境设定

Shell程序的控制结构

Shell脚本使用

Page 10: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

用户使用 shell的设定–通过查看 /etc/passwd文件可以查看用户使用的 shell类型

– /etc/passwd节选

root:x:0:0:root:/root:/bin/bashbin:x:2:2:bin:/bin:/bin/shsys:x:3:3:sys:/dev:/bin/shsync:x:4:65534:sync:/bin:/bin/syncgames:x:5:60:games:/usr/games:/bin/shman:x:6:12:man:/var/cache/man:/bin/shlp:x:7:7:lp:/var/spool/lpd:/bin/shmail:x:8:8:mail:/var/mail:/bin/shywang:x:1000:1000:ywang,,,:/home/ywang:/bin/bash

用户名

密码:加密的密码,系统有另外的文件存放加密的密码 /etc/shadow

用户 id 组 id

描述信息 起始目录 用户登录

shell

Page 11: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

更改用户 Shell方法:

更改 /etc/passwd文件

usermod –s [shell] [user]

Page 12: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

• linux下的 shell–通过 cat /etc/shells命令查看安装的 shell

查看安装了哪些 Shell

安装的 Shell及路径

Page 13: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

Bash配置文件

.bash_history 记录命令历史记录.bash_logout 退出 Shell时要执行的命令.bash_profile 登入 Shell时要执行的命令,只在会话开始时被读取一次.bashrc 每次打开新的 Shell 时要执行的命令 别名和函数之类通常放在该文件中

系统级的配置文件存储在 /etc/profile 及目录/etc/profile.d

Page 14: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

vim配置文件

通常在 /usr/share/vim/vimrc或 /etc/vim/vimrc

syntax on :根据程序相关语法显示不同颜色

set autoindent :设置自动缩进 ,按回车后新行与上一行自动 对齐。

set tabstop=[n]:设置 TAB键缩进量 ,n为数字,描述缩进 n列

set nu:设置行号,取消行号就用: set nonusource : 用于重新执行刚修改的初始化文件,使之立即生效

,而不必注销并重新登录。语法: source [filename]

Page 15: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

bash 的几种特性使命令的输入变得更容易: 命令补齐通配符命令历史记录输入重定向输出重定向 管道

Page 16: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

3.命令补充

多命令执行

分号

语法: command1;command2

先执行 command1,不管 command1是否出错,继续执行

command2

&&

语法: command1 && command2

只有 command1正确运行完毕,才执行 command2 例如 :cd /${解压路径 } && ./configure && make && make install

Page 17: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

命令替换

语法: command1 $(command2)

command1 `command2`——注意: `是后引号

例如: vim $(locate main.f) ( 先运行 sudo updatedb)

vim `locate main.f`

注: vim可以跟多个文件名

如: vim f1 f2 f3

在 Ed Mode(命令行模式 )下, :n看下一个文件 ,:N看上一个文件 :files 列出当前 vim打开的所有文件

Page 18: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端
Page 19: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

命令延伸

一行命令太多,可以用 \来延伸至下一行在脚本中,如果一行命令太长,同样可以用 \进行连接

Page 20: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

通配符

bash 支持三种通配符:

* 匹配任何字符和任何数目的字符 ? 匹配任何单字符

[ … , - , ! ] “按照范围 按照范围 -” “、列表 ...” 或不匹配“ !” 等形式匹配指定的字符

Page 21: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

rm *.bak——所有以 .bak结尾的文件

rm *[!6].bak——所有以 .bak结尾,并且点号之前不为6的文件

ls *.????——所有点号后有四个字符的文件

rm *[!6]?.*——所有点号前倒数第二个字符不为 6的文件

ls [13]*——所有以 1或 3开头的文件

ls [1-3]*——所有以 1~3之间某个数字开头的文件

ls [a-d,x,y]*——所有以 a,b,c,d,x,y开头的文件

“取反的 !”必须放在 [里面 ]

Page 22: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

通用的管道,由管道符号 |来标识。

语法是:

command1 | command2 |command3 | …

例如:分屏显示 px aux命令的执行结果

ps aux | more

Page 23: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

输入 /输出重定向 :command > file 把 command命令的输出重定向到文件 file中 ,如果 file已经存在,则清空原有文件。command >> file 把 command命令的输出重定向到文件 file中,如果 file已经存在,则把信息加在原有文件后面。command< file 使 command命令从 file读入command << C 从命令行读取输入,直到一个与 C相同的行结束。command < file1 >file2 command命令从文件 file1读 ,输出到文件 file2

Page 24: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

成组命令{ }形式以花括号括起来的全部命令可视为语法上的一条命令,出现在管道符的一边。

例如: { echo “User Report for ` date ` . ”; who ; } |

pr

注:使用花括号时在格式上应注意 : “左括号 { ”后面应有一个空格 ; “右括号 }” 之前应有一个分号 ;

Page 25: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

4.Shell脚本简介

Shell脚本的特点及用途:Shell脚本可以认为是将 shell命令按照控制结构组织到一个文本文件中,批量的交给 shell 去执行

不同的 shell解释器使用不同的 shell命令语法Shell 脚本解释执行,不生成可以执行的二进 制文件可以帮助用户完成特定的任务,提高使用、维护

系统的效率了解 shell脚本可以更好的配置和使用 linux

Page 26: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

脚本编译和运行过程

一般步骤:编辑文件保存文件将文件赋予可以执行的权限运行及排错

常用到的命令:vi,编辑、保存文件ls -l 查看文件权限chmod 改变程序执行权限直接键入文件名运行文件

Page 27: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

养成良好的脚本书写习惯:

先声明适用哪种 shell

注明脚本的内容功能、版本信息、作者、文件创建日期等

每一个大步骤的主要功能

最好加个后缀 .sh,以便他人识别

脚本执行方法有两种:

更改脚本属性,将其改为可执行的属性,例如: chmod +x

scripts.sh,然后直接运行该脚本

直接以 sh命令来执行脚本的内容,例如: sh scripts.sh

Page 28: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

test.sh

echo "Programme Ends."12

say_hello11

echo "Programme Starts Here....."10

}9

echo "Hello $name"8

read name7

echo "Enter Your Name,Please. :"6

{5

function say_hello()4

#a Function3

#a Simple shell Script Example2

#!/bin/bash1

解释

输出提示,提示程序结束

调用函数

程序开始的第一条命令,输出提示信息

函数结束

输出

读入用户的输入到变量 name

echo命令输出字符串

函数开始

以 functin 开始,定义函数

同上

以 # 开始,其后为程序注释

以 #! 开始,其后为使用的 shell

Shell脚本简单示例

Page 29: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

一般结构shell类型

函数主过程

#!/bin/bash

function fun1(){

}

......

funciton funn(){

}

...........

.

.

.

.

.

.

函数定义

shell类型

主过程

Page 30: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

交互式脚本

Shell下最简单的交互式命令: read

Page 31: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

单引号:字符串双引号:引用变量

Page 32: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

脚本的参数代号:$0 脚本的文件名$1 第一个附加参数$2 第二个附加参数$3 ......$n

Page 33: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

5.Shell脚本语法

5.1变量命名规则

变量与变量值之间以等号 =来连接

等号两边不能直接接空格符

变量名称只能是英文字母与数字,但是数字不能做为开头字符

“ ‘若有空格符,可以使用双引号 或单引号 来将变量内容结合起来

注意:双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符

必要时需要以字符 \来将特殊字符(如: Enter , $ , \ , 空格符 , ‘等)变成一般字符

若该变量需要在其他子程序中起作用,需要以 export来使变量生效,如: export PATH

通常,大写字母的变量为系统的预设变量,自定义变量使用小写字母,以方便判断

Page 34: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

5.2变量声明和引用

在 shell中,所有没有声明的变量都默认是呈现字符串形式。

声明变量使用 declare指令。

delcare [-afir] var=... -a 定义为数组 array -f 定义为函数 function -i 定义为整数 integer -r 定义为只读 readonly

Page 35: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

5.3变量的引用• 格式 :

$变量名,或者 ${变量名 }变量名为一个字符用方式一,变量名多于一个字符建议用第 2中方式

• 例子:a=1abc="hello"echo $aecho ${abc}

Page 36: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

所有没有声明的变量都默认是呈现字符串形式,所以 $a,$b,$c,$就成为字符串形式,而不会进行任何算术运算。

Page 37: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端
Page 38: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

出现错误原因,因为使用了 sh命令运行脚本,在 bash下直接执行就可以通过

Page 39: 第 5章 Shell 脚本及应用 - USTCstaff.ustc.edu.cn/~ccwang/Linux_ch5_1.pdf · • shell是用户和系统内核之间的接口程序 • shell是命令解释器 • 在本章中,shell指linux的终端

declare –r var等价于

readonly var