目录
一、Shell概述
Shell是一个命令行解释器,用于接收应用程序/用户命令,然后调用操作系统内核。
Linux是一个功能强大的编程语言,易编写、易测试、灵活性较强。
二、Shell脚本基本语法
脚本格式:以**#!/bin/bash**开头(指定解析器)
文件命名以**.sh**结尾
使用 vim 文件名打开文件
shell脚本常见的执行方式:
- 采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限);
- 采用输入脚本的绝对路径或相对路径执行脚本(必须赋予可执行权限,使用chmod +x 文件名),如果采用相对路径直接是文件名,就在前面加**./**
- 在脚本路径前加**.** 或者source
三、变量
1、系统预定义变量
常用系统变量:HOME、PWD、SHELL、USER等;
实例:
查看系统变量的值:echo $HOME
显示当前Shell中所有的变量:set
2、自定义变量
基本语法:
- 定义变量:变量名=变量值,=号前不能有空格;
- 撤销变量:unset 变量名;
- 全局变量:export 变量名;
- 声明静态变量(只读变量):readonly变量,注意,不能unset
变量定义规则:
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写;
- 等号两侧不能有空格;
- 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算,单引号会将内容全部输出,双引号会对特殊字符进行转义;
- 变量值如果有空格,需要使用单引号或双引号括起来;
3、特殊变量
$n:n为数字,$0代表该脚本名称,$1-9代表第1到第9个参数,10以上的参数需要使用大括号包含,如{10};
$#:获取输入参数的个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性;
**\***:这个变量代表命令行中所有的参数,*把所有参数看成一个整体;
**@**:这个变量代表命令行中所有的参数,@把每个参数区分对待,可以理解为数组或列表;
$?:最后一次执行命令的返回状态,如果这个变量为0,证明上一个命令正确执行,如果这个变量值非0(具体数字由命令自己决定),证明上一个命令执行不正确。
四、运算符
基本语法:$((运算式)) 或 $[运算式]
五、条件判断
基本语法:
- test condition
- [ condition ] (condition前后需要有空格,表达式中 = 前后也要有空格)
常用的判断条件:
两个整数之间的比较:
- -eq:等于;
- -ne:不等于;
- -lt:小于;
- -le:小于等于;
- -gt:大于等于;
- -ge:大于等于;
按照文件权限进行判断:
- -r:有读的权限;
- -w:有写的权限;
- -x:有执行的权限;
- -e:判断文件是否存在;
- -d:判断是都为目录;
多条件判断:&&表示前一条命令执行成功时,才执行后一条命令,||表示上一条命令执行失败后才执行下一条命令;
六、流程控制
1、if判断
单分支的基本语法:
if [ 条件判断式 ];then 程序 fi
或者
if [ 条件判断式 ] then 程序 fi
多分支语法:
if [ 条件判断式 ] then 程序 elif [ 条件判断式 ] then 程序 else 程序 fi
2、case语句
基本语法:
case $变量名 in "值1") 如果变量值等于值1,则执行程序1 ;; "值2") 如果变量值等于值2,则执行程序2 ;; *) 如果变量值都不是以上的值,则执行此程序; esac
注意事项:
- case行尾必须为单词"in",每一个模式匹配必须以右括号")"结束;
- 双分号";;"表示命令行结束,相当于java中的break;
- 最后的"*)"表示默认模式,相当于java中的default;
3、for循环
基本语法:
for (( 初始值;循环控制条件;变量变化 )) do 程序 done
或者
for 变量 in 值1 值2 值3 ...... do 程序 done
4、while循环
基本语法:
while [ 条件判断式 ] do 程序 done
七、read读取控制台输入
基本语法:
read (选项) (参数)
选项:
- -p:指定读取值时的提示符;
- -t:指定读取等待的时间,如果-t不加表示一直等待;
参数:
- 变量:指定读取值的变量;
八、函数
1、系统函数
basename:basename [string/pathname] [suffix] , suffix指的是后缀,可省略可指定,指定后会将后缀名去掉的。
basename命令会删掉所有的前缀包含最后一个('/')字符,然后将字符串显示出来,该命令的功能就是取路径中的文件名称。
dirname:dirname 文件绝对路径 ,从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)。
2、自定义函数
基本语法:
[ function ] funname[(0)] { Action; [return int;] } // [] 中的东西可省略
注意事项:
- 必须在调用函数地方之前,先声明函数,shell脚本是逐行运行的,不会向其他语言一样先编译;
- 函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行的运行结果作为返回值,return 后跟数值n(0-255);
- 函数的参数通常可以在命令行中输入位置参数来实现。
九、正则表达式
正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串;
常见的匹配字符:
- ^:匹配一行的开头;
- $:匹配一行的结束;
- .:匹配任意的字符;
- *:不单独使用,他和上一个字符连用,表示匹配上一个字符0次或多次;
- []:表示匹配[]内的任意一个字符;
- \:表示转义,并且不会单独使用;
十、文本处理工具
cut:在文件中负责剪切数据,cut命令从文件中的每一行剪切字节、字符和字段,并将这些输出;
基本用法:cut [选项参数] filename,默认分隔符是制表符
选项说明:
- -f:列号,提取第几列;
- -d:分隔符,按照指定分隔符分割列,默认是制表符"\t";
- -c:按字符进行切割,后面加n表示取第几列。
awk:将文件逐行读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理;基本用法:awk [选项参数] '/pattern1/{action1} /pattern2/{action2} ...' filename
pattern:表示awk在数据中查找的内容,就是匹配模式(正则表达式) ;
action:在找到匹配内容时所执行的一系列命令;
选项参数说明:
- -F:指定输入文件分隔符;
- -v:赋值一个用户定义变量;
awk的内置变量:
- FILENAME:文件名;
- NR:已读的记录数(行号);
- NF:浏览记录的域的个数(切割后,列的个数)。