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:浏览记录的域的个数(切割后,列的个数)。
相关推荐
vip45122 分钟前
Linux 经典面试八股文
linux
大霞上仙24 分钟前
Ubuntu系统电脑没有WiFi适配器
linux·运维·电脑
weixin_4426434242 分钟前
推荐FileLink数据跨网摆渡系统 — 安全、高效的数据传输解决方案
服务器·网络·安全·filelink数据摆渡系统
Karoku0661 小时前
【企业级分布式系统】Zabbix监控系统与部署安装
运维·服务器·数据库·redis·mysql·zabbix
为什么这亚子1 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
半桶水专家1 小时前
用go实现创建WebSocket服务器
服务器·websocket·golang
布值倒区什么name1 小时前
bug日常记录responded with a status of 413 (Request Entity Too Large)
运维·服务器·bug
孤客网络科技工作室2 小时前
VMware 虚拟机使用教程及 Kali Linux 安装指南
linux·虚拟机·kali linux
。puppy2 小时前
HCIP--3实验- 链路聚合,VLAN间通讯,Super VLAN,MSTP,VRRPip配置,OSPF(静态路由,环回,缺省,空接口),NAT
运维·服务器
颇有几分姿色2 小时前
深入理解 Linux 内存管理:free 命令详解
linux·运维·服务器