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 选项 参数

 

实例:按 : 分割,对第二行进行倒序排序

 

posted @ 2023-06-09 16:59  小王同学学编程  阅读(68)  评论(0编辑  收藏  举报
levels of contents