首页 > 系统相关 >Shell编程速查手册(仅入门)

Shell编程速查手册(仅入门)

时间:2024-07-18 14:25:58浏览次数:17  
标签:脚本 shell 匹配 变量 编程 sh Shell 字符串 速查

一.Shell概述

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

二.Shell脚本入门

脚本以 #!/bin/bash 开头(指定解析器):告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 helloworld.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行。

脚本的常用执行方式采用 bash 或 sh+脚本的相对路径或绝对路径,不用赋予脚本+x 权限

sh+脚本的相对路径:sh ./helloworld.sh;sh+脚本的绝对路径

sh /home/shells/helloworld.sh

bash+脚本的相对路径

bash ./helloworld.sh

bash+脚本的绝对路径

bash /home/shells/helloworld.sh

这种执行方法,本质是 bash 解析器帮你执行脚本,所以脚本本身不需要执权限。

采用输入脚本的绝对路径或相对路径执行脚本,首先要赋予 helloworld.sh 脚本的+x 权限:

chmod +x helloworld.sh

相对路径

./helloworld.sh

绝对路径

/home/shells/helloworld.sh

这种执行方法,本质是脚本需要自己执行,所以需要执行权限

三.变量

变量类型:运行shell时,会同时存在三种变量:

局部变量: 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。】

环境变量: 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

shell变量: shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。

查看所有环境变量用env命令:

自定义变量

(1)定义变量:变量名=变量值,注意,=号前后不能有空格e

(2)撤销变量:unset变量名

(3)产明静态变量:readonly变量,注意:不能unset

变量定义规则

(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。

(2)等号两侧不能有空格

(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。

(4)变量的值如果有空格,需要使用双引号或单引号括起来。

shell字符串字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号:任何字符都会原样输出,单引号字符串中的变量是无效的;不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号:双引号里可以有变量;双引号里可以出现转义字符。

四.运算符

基本语法

“$ ((运算式))”或“$[ 运算式 ]”

案例实操

计算(2+3)*4的值$ =$[(2+3)*4]echo $S

注意!如果都加空格,会把a当成一个命令来执行。如果不加空格,1+2会被认作视一个字符串,直接输出而不进行计算。

所以出现了expression的用法

expr 后面的加空格相当于传参数,它自己读取 第一个量 、符号、第二个量,然后进行运算,但是在处理乘法“*”的时候,需要加“/”因为“*"在运算中有特别的含义。但这样使用太过于繁琐,有了更加简单的用法——$

基本语法:

“$ ((运算式))” 或“$ [运算式]”

(运算式中无所谓加不加空格)

五.条件判断

在Linux中,返回值1为false,返回值为0为true.

(一) 基本语法

(1) test conditione

(2) [ condition ] (注意 condition 前后要有空格)

注意:条件非空即为true,[ ]返回 flse。

(二) 常用判断条件

(1)两个整数之间比较

-eq 等于(equal)
-lt 小于(less than)
-gt大于(greater than)
-ne 不等于(not equal)
-le 小于等于(less equal)
-ge 大于等于(greater equal)
如果是字符串之间的比较,用号“=”判断相等,用“!=”判断不等。

(2)按照文件权限进行判断-r有读的权限(read) -w有写的权限(write) -x有执行的权限(execute)

(3)按照文件类型进行判断-e文件存在(existence) -f文件存在并且是一个常规的文件(file) -d文件存在并且是一个目录(directory)

(4)多条件判断 :

[ ryan ] && echo ok || echo notok

(&&表示前一条命令执行成功时,才执行后一条命令,||表示上一条命令执行失败后,才执行下一条命令)类似于三目运算符:ryan?ok:notok

六.流程控制

(一) 单分支

if [ 条件判断式 ];then

        程序

fi

if [ 条件判断式 ]

then

        程序

fi

(二) 多分支

if [ 条件判断式 ]

then

        程序

elif [ 条件判断式 ]

then

        程序

else

逻辑&& 也可以用 -a (and)代替,这样就只用写一个括号

(三) case 语句

基本语法case $变量名 in“值 1”) 如果变量的值等于值1,则执行程序1;;"值2”) 如果变量的值等于值2,则执行程序2;; ..省略其他分支...*) 如果变量的值都不是以上的值,则执行此程序;;esac

注意事项

Ⅰ:case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。

Ⅱ:双分号“;;”表示命令序列结束,相当于java中的break。(3)最后的“*)”表示默认模式,相当于default。

(四) for 循环

基本语法

for (( 初始值;循环控制条件;变量变化 ))

do

        程序

done

还有一种用法是:

for 变量 in 值1 值2 值3…

do

        程序

done

(五) while循环

基本语法

while [ 条件判断式 ]

do

        程序

done

七.读取控制台

read 读取控制台输入

基本语法:

read (选项) (参数)

选项:

-p:指读取值时的提示符

-t:指定读取值时等待的时间 (秒),如果不加表示一直等待参数:

参数:指定读取值的变量名

八.函数

(一) 系统函数

1.basename

基本语法:

basename [ string /pathname ] [suffix]

功能描述:basename命令会删掉所有的前缀包括最后一个('/')字符,然后将字符串显示出来。

​ basename 可以理解为取路径里的文件名称

选项:suffix为后缀,如果 suffx被指定了,basename 会将 pathname 或 string 中的 suffx 去掉。

2.dirname

基本语法:

dirname 文件绝对路径

功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分) dimmame 可以理解为取文件路径的绝对路径名称

(二) 自定义函数基本语法

[ function ] funname [()]{ Action; [ return int; ]}

1.必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言样先编译。

2.函数返回值,只能通过$?系统变量获得,可以显示加:return返回。如果不加,将以最后一条命令运行结果,作为返回值。

return后跟数值n(0-255)

九.正则入门

正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在imnux中,grep,sed,awk等文本处理工具都支持通过正则表达式进行模式匹配。

常规匹配 一串不包含特殊字符的正则表达式匹配它自己。

(一) 常用特殊字符

1.特殊字符:^

匹配一行的开头,例如:

cat /etc/passwd | grep ^a

会匹配出所有以a开头的行。

2.特殊字符:$

匹配一行的结束,例如:

cat /etc/passwd | grep a$

会匹配出所有以a结尾的行

3.特殊字符:.

匹配一个任意的字符,例如:

cat /etc/passwd l grep r..t

会匹配包含 rabt,rbbt.rxdt,root 等的所有行

4.特殊字符:*

不单独使用,他和上一个字符连用,表示匹配上一个字符0次或多次,例如:

cat /etc/passwdgrep ro*t

会匹配 rt, rot,root,rooot,roooot 等所有行

5.字符区间(中括号):[]

[]表示匹配某个范围内的一个字符,例如:

[6,8]匹配6或者8;

[0-9]匹配一个 0-9的数字;

[0-9]*匹配任意长度的数字字符串;

[a-z]匹配一个 a-z之间的字符;

[a-z]*:匹配任意长度的字母字符串

十。文本处理工具

(一) cut

cut 的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每行剪切字节、字符和字聚并将这些字节、字符和字段输出。

1.基本用法

cut [ 选项参数 ] flenamee(默认分隔符是制表符)

2.选项参数说明

-f :列号,提取第几列

-d:分隔符,按照指定分隔符分割列,默认是制表符“\t”

-c:按字符进行切割后,加n表示取第几列,比如-c l

(二) awk

awk是一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

1.基本用法

awk [ 选项参数 ] '/pattern1/{actionl} /pattern2/faction2} ...' filename

pattern表示 awk 在数据中查找的内容,就是匹配模式action表示在找到匹配内容时所执行的一系列命令

2.选项参数

-F:指定输入文件分隔符

-v:赋值一个用户定义变量

3.awvk 的内置变量

FILENAME:文件名

NR:已读的记录数(行号)

NF:浏览记录的域的个数(切割后,列的个数)

标签:脚本,shell,匹配,变量,编程,sh,Shell,字符串,速查
From: https://blog.csdn.net/qq_39209622/article/details/140517885

相关文章

  • 【攻防技术系列】shellcode免杀
    接上文:【攻防技术系列】shellcode初识二、shellcode简单免杀2.1什么是免杀?免杀技术全称为反杀毒技术(AntiAnti-Virus)简称“免杀“。它指的是一种能使病毒木马免于被杀毒软件查杀的技术。由于免杀技术的涉猎面非常广,包含反汇编、逆向工程、系统漏洞等技术,所以难度很高。2.2......
  • Linux入门---(二)shell命令
    1.1man获得帮助信息help只能查询内嵌命令,外部命令查询格式:命令--help1.2快捷键ctrl+u,清空当前已输入,但未执行的命令1.3文件目录类从根目录/开始的就是绝对路径,从当前文件夹开始的就是相对路径pwd显示当前工作目录的绝对路径ls列出目录的内容(ls-a列出全部文件)cd切......
  • Leetcoede编程基础0到1——1768. 交替合并字符串& 389. 找不同
    1768.交替合并字符串题目描述:给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。返回 合并后的字符串 。输入输出实例:  示例1:输入:word1="ab......
  • 深入探讨:使用 Spring AOP 实现 Lock4j 的声明式和编程式分布式锁
    深入探讨:使用SpringAOP实现Lock4j的声明式和编程式分布式锁在现代分布式系统中,分布式锁是一个非常重要的概念。它可以帮助我们在多个节点之间协调资源访问,防止数据不一致和竞争条件。今天,我们将深入探讨如何使用Lock4j和SpringAOP来实现声明式和编程式的分布式锁。什......
  • 深入探讨 Spring 6 的面向切面编程(AOP)
    深入探讨Spring6的面向切面编程(AOP)大家好,今天我们来聊聊Spring6中的面向切面编程(AOP)。AOP是Spring框架中一个非常强大的特性,它可以帮助我们在不改变原有代码的情况下,添加一些通用的功能,比如日志记录、事务管理、安全检查等。什么是AOP?AOP,全称Aspect-OrientedProgra......
  • 高质量C/C++编程指南总结(十)—— const 用法
    const的用法1)用const修饰函数的输入参数如果输入的参数采用“指针传递”,那么加const修饰可以防止意外地改动该指针,起到保护作用。如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const修饰。对于非内部数据类......
  • 高质量C/C++编程指南总结(八)—— C++高级特性
    1.成员函数重载特征相同的范围(在同一个类中)函数名称相同参数不同virtual关键字可有可无2.覆盖的特征覆盖是指派生类函数覆盖基类函数,所以范围不同(分别位于派生类和基类)函数名称相同参数相同基类函数必须有virtual关键字如下示例中,函数Base::f(int)与Base::f(flo......
  • 《UDP---FTP网络编程》
    UDP网络编程服务端(1)使用DatagramSocket创建socket,监听6666端口(2)使用DatagramPacket创建数据包(3)调用.receive()接收数据包(4)从数据包中读取数据**注意:使用String构造方法,将字节转换为原始的字符串(5)向客户端发送响应消息客户端(1)使用DatagramSo......
  • 为什么说 Java 没有无符号整数类型?这对编程有哪些潜在影响?
    在Java的设计之初,其创始人詹姆斯·戈斯林(JamesGosling)和团队做出了不包含无符号整数类型(如无符号的byte、short、int、long)的决定。这一设计选择背后有几个原因,同时也给编程带来了一些潜在的影响。让我们逐一探讨。为什么Java没有无符号整数类型?简化设计:Java旨在成为一种......
  • 网络编程-TCP/IP
    网络概述网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供的服务网络体系结构即指网络的层次结构和每层所使用协议的集合两类非......