shell脚本
1. shell脚本入门
1.1 脚本格式
脚本以#!/bin/bash开头(指定解析器)
1.2 第一个shell脚本
(1)首先创建一个helloworld.sh文件
(2)输入解析器和内容,并保存
(3)执行脚本,可以使用sh、bash、./(./是相对路径,是自己调用自己,会导致权限不够,需要修改权限,chmod修改权限)
1.3 第二个shell脚本:多命令处理
需求:在/home/script/目录下创建一个banzhang.txt,在banzhang.txt文件中增加“banzhang”
(1)创建batch.sh
(2)编写脚本,>>表示为追加
(3)执行,并查看
2. shell中的变量
2.1 系统变量
$HOME、$PWD、$SHELL、$USER等
更加方便调用。
2.2 自定义变量
2.2.1 基本语法
(1)定义变量:变量=值(等号两边没有空格)
实例:
(2)撤销变量:unset 变量
实例:
(3)声明静态变量:readonly 变量(不能unset)
2.2.2 变量定义规则
1. 变量名称可以由字母、数字、下划线组成,但是不能以数字开头,环境变量名建议大写。
2. 等号两侧不能有空格。
3. 在bash中,变量默认类型都是字符串类型,无法直接进行数值计算。
4 . 如果变量的值有空格,需要使用双引号或单引号括起来。
5. 可把变量提升为全局环境变量,可供其他shell程序使用。通常用于java home,hadoop home等。
实例:
(1)定义一个c变量,在写入helloworld脚本
(2)执行脚本发现并没有c变量的值
(3)使用export将c变量提升为全局变量,然后执行脚本,然后可以发现c变量的值
2.3 特殊变量
2.3.1 $n
$n(功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10})
实例:创建一个脚本,diyi为第一参数,dier为第二参数,因为后续脚本里没写入新的参数,所以disan不显示;
2.3.2 $#
功能描述:获取所有输入参数个数,常用于循环;
实例:获取输入三叔的个数
2.3.3 $*、$@
$*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体;
$@:这个变量也代表命令行中所有的参数,$@把每个参数区别对待;
实例:
2.3.4 $?
最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量为非0(具体是那个数,又命令自己来决定),则证明上一个命令执行不正确。
实例:
3. 运算符
1. 基本语法
(1)$((运算符))或$[运算符]
(2)expr +,-,\*,/,% 加,减,乘,除,余
注意:expr运算符间要有空格;
实例:
4. 条件判断
1. 基本语法
[ condition ]:注意condition前后要有空格;
2. 常用判断条件
实例1:判断1是否大于2,通过$?查看;判断3是否大于2,通过$?查看
实例2:判断helloworld.sh是否有写权限
3. 多条件判断(&&条件与,表示前一条命令执行成功时,才能执行后一条命令,||条件或,表示上一条命令执行失败时,才执行下一条命令)
5. 流程控制
5.1 if判断
语法:
注意:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格;
(2)if后要有空格;
实例:输入一个数字,如果是1,则输出one,如果是2,则输出two,如果是其他什么也不输出。
5.2 case判断
语法:
注意:
(1)case行尾必须为单词in,每一个模式匹配必须以右括号“)”结束;
(2)双分号“;;”表示命令序列结束,相当于java中的break;
(3)最后的“*)”表示默认模式,相当于java中的default;
实例:输入一个数字,如果是1输出one,如果是2输出2,如果是其他输出qita
5.3 for判断
语法:
或
实:1:1加到100
实例2:打印所有输入参数
5.4 while判断
语法:
实例:1加到100
6. read读取控制台输入
语法:read 选项 参数
选项:-p(指定读取值时的提示符);-t(指定读取值时等待的时间(秒));
参数:变量(指定读取值得变量名)
实例:提示7秒内,读取控制台输入的名称
NAME为变量名
7秒内未输入变量值,则不在等待
7. 函数
7.1 系统函数
7.1.1 basename
语法:basename [string/pathname] [suffix]
功能描述:basename命令会删除掉所有的前缀包括最后一个(/)字符,然后将字符串显示出来。
实例:
7.1.2 dirname
dirname 文件绝对路劲
功能描述:从给定的包含绝对路劲的文件名中去除文件名(非目录的部分),然后返回剩下的路劲(目录的部分)
实例:
7.2 自定义函数
语法:
注意:
(1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其他语言一样先编译。
(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果作为返回值。return后跟数值n(0-255)
实例:
8. shell工具(重点)
8.1 cut
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。常用于切割日志。
语法:cut [选项参数] filename
说明:默认分隔符是制表符
参数:
实例1:切割cut.txt第一列
实例2:切割cut.txt第二、三列
实例3:切割出第一列中的one
实例4:选取系统PATH变量值,第2个“:”开始后的所有路劲
8.2 sed
一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
语法:sed [选项参数] 'command' filename
参数:-e(直接在指令列模式下进行sed的动作编辑)
命令功能描述:
实例:将“5 5”这个单词插入到ex_sed.txt第二行下,打印
实例:删除ex_sed.txt文件所有包含one的行
实例:将one替换为1,g表示global,全部替换
实例:第二行删除,并将one替换为1
8.3 awk
awk [选项参数] 'pattern1{action1} pattern2{action2}...' filename
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
参数:
实例:搜索passwd文件以root关键字开头的所有行,并输出该行的第7列
实例:搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割。
注意:只有匹配了pattern的行才会执行action;正则以/^开头
8.4 sort
在linux里非常有用,他将文件进行排序,并将排序结果标准输出
语法:sort 选项 参数
实例:按 : 分割,对第二行进行倒序排序