Shell编程

目录

一、Shell概述

二、Shell脚本基本语法

三、变量

1、系统预定义变量

2、自定义变量

3、特殊变量

四、运算符

五、条件判断

六、流程控制

1、if判断

2、case语句

3、for循环

4、while循环

七、read读取控制台输入

八、函数

1、系统函数

2、自定义函数

九、正则表达式

十、文本处理工具


一、Shell概述

Shell是一个命令行解释器,用于接收应用程序/用户命令,然后调用操作系统内核。

Linux是一个功能强大的编程语言,易编写、易测试、灵活性较强。

二、Shell脚本基本语法

脚本格式:以**#!/bin/bash**开头(指定解析器)

文件命名以**.sh**结尾

使用 vim 文件名打开文件

shell脚本常见的执行方式:

  1. 采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限);
  2. 采用输入脚本的绝对路径或相对路径执行脚本(必须赋予可执行权限,使用chmod +x 文件名),如果采用相对路径直接是文件名,就在前面加**./**
  3. 在脚本路径前加**.** 或者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:浏览记录的域的个数(切割后,列的个数)。
相关推荐
软件技术员27 分钟前
Let‘s Encrypt SSL证书:acmessl.cn申请免费3个月证书
服务器·网络协议·ssl
哎呦喂-ll38 分钟前
Linux进阶:环境变量
linux
耗同学一米八40 分钟前
2024 年河北省职业院校技能大赛网络建设与运维赛项样题四
运维·网络
Rverdoser40 分钟前
Linux环境开启MongoDB的安全认证
linux·安全·mongodb
PigeonGuan1 小时前
【jupyter】linux服务器怎么使用jupyter
linux·ide·jupyter
一条晒干的咸魚1 小时前
【Web前端】创建我的第一个 Web 表单
服务器·前端·javascript·json·对象·表单
东华果汁哥1 小时前
【linux 免密登录】快速设置kafka01、kafka02、kafka03 三台机器免密登录
linux·运维·服务器
咖喱鱼蛋2 小时前
Ubuntu安装Electron环境
linux·ubuntu·electron
ac.char2 小时前
在 Ubuntu 系统上安装 npm 环境以及 nvm(Node Version Manager)
linux·ubuntu·npm