shell概述
Shell,既是编程语言,同时也是一个命令解释器.
对于shell语言的解析器在linux中有sh,bash,nologin,csh,tcsh
shell语言的编写以#!/bin/bash开头,作为指定解析器
例如
#!/bin/bash
echo "hello world"
在该shell脚本执行后会输出一个hello world
执行shell脚本的方式有
(1)bash 或者sh 后面接脚本的相对或者绝对路径,这两种方式无需给脚本添加上x的执行权限.
(2) 直接输入脚本的相对或者绝对路径来执行,这样的方式必须先给脚本添加上执行的权限
(3)在脚本的路径前添加上" ."或者source的方式来执行,这样的方式无需像bash或者sh那样打开一个子shell来执行,子shell开与不开的区别在于环境变量的继承关系.
Shell的语法:
shell中的变量有系统变量与自定义变量和特殊变量.使用set可以查看到全部的变量
常见的系统变量有$HOME,$PWD,$SHELL,$USER
自定义变量的语法,变量名=变量值,等号前后不能有空格,unset来撤销变量,使用readonly来声明静态变量,静态变量不能被unset撤销
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。(2)等号两侧不能有空格
(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
变量的值中如果有空格,使用双引号或者单引号括起来
使用export的方式将变量提升为全局环境变量
特殊的变量有:
$n(n为数字,$0代表该脚本的名称,其余的表示参数,十以上的参数使用{}将数值包含其中)
$#(作用为获取所有输入参数的个数)
$*(代表命令行中的所有参数,将所有的参数看作一个整体)
$@(这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$?(返回最后一次执行的命令的状态,如果值是0表示上一次的命令正确执行,如果是非0(可以自己定义)表示执行不正确)
运算符:
基本的语法有:$(( ))或者$[ ]
条件判断
[ condition ](注意condition前后要有空格)
常用判断条件
(1)两个整数之间比较
-eq 等于(equal) -ne 不等于(not equal)
-lt 小于(less than) -le 小于等于(less equal)
-gt 大于(greater than) -ge 大于等于(greater equal)
(2)按照文件权限进行判断
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)
(3)按照文件类型进行判断
-e 文件存在(existence)
-f 文件存在并且是一个常规的文件(file)
-d 文件存在并且是一个目录(directory)
多条件判断:(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
流程控制:
if判断,case语句,for循环,while循环,
if的基本语法
(1)单分支
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
(2)多分支
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
case语句
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
(1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
(2)双分号“;;”表示命令序列结束,相当于java中的break。
(3)最后的“*)”表示默认模式,相当于java中的default。
for循环:
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
(2)基本语法2
for 变量 in 值1 值2 值3…
do
程序
done
while循环:
while [ 条件判断式 ]
do
程序
done
read读取控制台输入
1)基本语法
read (选项) (参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)如果-t不加表示一直等待
参数
变量:指定读取值的变量名
函数
basename,dirname
基本语法
basename [string / pathname] [suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
basename 可以理解为取路径里的文件名称
选项:
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
dirname 可以理解为取文件路径的绝对路径名称
自定义函数
基本语法
[ function ] funname[()]
{
Action;
[return int;]
}
(1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。
(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
Shell工具
cut,sort,awt
cut [选项参数] filename
说明:默认分隔符是制表符
选项参数说明
选项参数 | 功能 |
-f | 列号,提取第几列 |
-d | 分隔符,按照指定分隔符分割列,默认是制表符“\t” |
-c | 按字符进行切割 后加加n 表示取第几列 比如 -c 1 |
awk:一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
基本用法
awk [选项参数] ‘/pattern1/{action1} /pattern2/{action2}...’ filename
pattern:表示awk在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
2)选项参数说明
选项参数 | 功能 |
-F | 指定输入文件折分隔符 |
-v | 赋值一个用户定义变量 |
awk的内置变量
变量 | 说明 |
FILENAME | 文件名 |
NR | 已读的记录数(行号) |
NF | 浏览记录的域的个数(切割后,列的个数) |
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。
1)基本语法
Sort (选项) (参数)
选项 | 说明 |
-n | 依照数值的大小排序 |
-r | 以相反的顺序来排序 |
-t | 设置排序时所用的分隔字符 |
-k | 指定需要排序的列 |
参数:指定待排序的文件列表
wc命令用来统计文件信息。利用wc指令我们可以计算文件的行数,字节数、字符数等。
1)基本语法
wc [选项参数] filename
选项参数 | 功能 |
-l | 统计文件行数 |
-w | 统计文件的单词数 |
-m | 统计文件的字符数 |
-c | 统计文件的字节数 |
正则表达式的入门
正则表达式通常被用来检索、替换那些符合某个模式的文本。在Linux中,grep,sed,awk等命令都支持通过正则表达式进行模式匹配。
常用特殊字符:^(^ 匹配一行的开头),$($ 匹配一行的结束), . (. 匹配一个任意的字符)
* 不单独使用,他和上一个字符连用,表示匹配上一个字符0次或多次
特殊字符[ ]:[ ] 表示匹配某个范围内的一个字符
例如:[6,8]------匹配6或者8
[0-9]------匹配一个0-9的数字
[0-9]*------匹配任意长度的数字字符串
[a-z]------匹配一个a-z之间的字符
[a-z]* ------匹配任意长度的字母字符串
[a-c, e-f]-匹配a-c或者e-f之间的任意字符
特殊字符:\
\ 表示转义,并不会单独使用。由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如,我想找出所有包含 '$' 的行),就会碰到困难。此时我们就要将转义字符和特殊字符连用,来表示特殊字符本身