Shell编程基础
内容大纲
一、Shell编程
二、高级文本处理命令:sed、awk、cut
三、crontab定时器
一、Shell编程
- 概述
- Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell;
- Shell也是一门解释型的编程语言,即shell脚本;
- 一个系统可以存在多个shell,可以通过
cat /etc/shells
命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的;
- Shell脚本的执行方式
- 拥有执行权限的两种执行方式:
- 相对路径使用
./<shell-name>.sh
- 相对路径使用
<absolutely-path>/<shell-name>.sh
- 相对路径使用
- 不用执行权限的执行方式:
sh <shell-name>.sh
- 在脚本前加
.
或者..
的执行方式:. <shell-name>.sh
.. <shell-name>.sh
- 前面加
.
或..
的执行方式在当前进程中执行,而前面的方式会新开进程执行脚本。重要的是,前一种新开进程之间变量共享比后一种在当前进程执行变量的共享上更加困难;
- 拥有执行权限的两种执行方式:
- Shell中的变量
-
变量的分类(可使用
set
命令查看):- 系统变量,常见的有:
$HOME
、$PWD
、$SHELL
、$USER
等 - 自定变量,在sh脚本中定义的变量
- 系统变量,常见的有:
-
Shell中变量的使用注意:
- 等号两侧不能有空格;
- 变量名称一般习惯为大写;
- 双引号和单引号有区别:双引号可以替换变量,单引号会原样输出;
- 如果一个字符串中有空格,则必须使用引号包起来;
- 如果一个变量不再使用可以使用unset取消定义:
unset name
,但是如果一个变量使用readonly修饰,那么unset不会起作用; -
export
关键字,会把这个变量提升为全局变量;
-
Shell中的特殊变量
-
$?
表示上一个命令之行结束的状态值 -
$$
表示当前进程编号 -
$0
表示当前脚本名称 -
$<n>
表示n位置的输入参数(n代表数字,n>=1) -
$#
表示参数的个数,常用于循环 -
$*
和$@
都表示参数列表 ,区别:- $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以$1 $2 … $n 的形式输出所有参数;
- 当它们被双引号" "包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数;
-
-
示例
- 使用变量获取一个文本的单词个数
echo count = `wc -c yum.conf | cut -d ' ' -f1` echo count = $(wc -c yum.conf | cut -d ' ' -f1)
- 使用变量获取一个文本的单词个数
-
- 脚本的调试
- 方式1
sh -vx <shell-file-name>
- 方式2
- 在脚本中增加
set -x
- 在脚本中增加
- 方式1
二、高级文本处理命令:
sed
-
awk
- 简介
- awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
- awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。
- awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
- 使用
- 语法格式
awk '{pattern + action}' {filenames}
- 尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。
- awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
- 通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
- 语法格式
- 调用
-
命令行方式:
awk [-F field-separator] 'commands' input-file(s)
- 其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
- 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
-
shell脚本方式
- 将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
- 相当于shell脚本首行的:
#!/bin/sh
,可以换成:#!/bin/awk
-
将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
- 其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
-
- 简介
cut:文本切割
sort:行排序