Shell Script

news2024/12/23 5:15:22

目录

    • Shell Script的概述
    • Shell的主要版本
    • Shell脚本的建立与执行
    • Shell中的变量
    • Shell中的特殊字符
      • 通配符
      • 双引号
      • 倒引号(``)
      • 顺序分隔符(;)
      • 管道符
      • 逻辑与(&&)和逻辑或(||)
    • Shell中的输入输出命令
    • Shell中的程序控制语句
    • Shell 基础(补充)

Shell Script的概述

script是“脚本”的意思。shell script是利用shell的功能所写的一个“程序(program)”。
shell script可以被简单地看成是批处理文件,也是一个程序语言,并且这个程序语言都是利用shell与相关工具命令组成的,所以不需要编译即可运行。

 
 

Shell的主要版本

Shell的主要版本有如下几个:
1、Bourne Shell(简称sh)。
2、C-Shell(简称csh)。
3、Korn-Shell(简称ksh)。
4、Bash,bash是由sh发展而来,其中包括csh、ksh的特色,是当前Linux系统中使用的主流的Shell。Bash Shell就是指Linux系统中的黑窗口。
 
 

Shell脚本的建立与执行

shell脚本的建立
Shell脚本的建立可以使用vim、cat来建立,为了方便区分,我们在后缀加上.sh来区分shell脚本。

1.在shell script撰写中的注意事项

  • 命令的执行是从上而下、从左而右进行的。
  • 命令、选项与参数间的多个空格都会被忽略掉。
  • 空白行也将被忽略掉,并且按“Tab”键所生成的空白同样被视为空格键。
  • 如果读取到一个Enter符号(CR),就尝试开始运行该行(或该串)命令。
  • 如果一行的内容太多,则可以使用“[Enter]”来延伸至下一行。
  • “#”可作为注解。任何加在 # 后面的数据将全部被视为注解文字而被忽略。

2.运行shell script程序
假设程序文件名是 /home/dmtsai/shell.sh,那如何运行这个文件呢?
(1)直接命令下达:shell.sh文件必须要具备可读与可运行(rx)的权限。

  • 绝对路径:使用/home/dmtsai/shell.sh来下达命令。
  • 相对路径:假设工作目录在/home/dmtsai/,则使用./shell.sh来运行。
  • 变量“PATH”功能:将shell.sh放在PATH指定的目录内,如~/bin/,这个是指,我们将shell.sh放在任何一个$PATH中其中一个目录下面,任何我们就可以在任何地方使用这个脚本文件
    (2)以bash程序来运行:通过“bash shell.sh”或“sh shell.sh”来运行。

例如:

#!/bin/bash
# Program:
# This program shows "Hello World!" in your screen.
# History:
# 2021/08/23	Bobby	First release
echo -e "Hello World! \a \n"
exit 0

解释一下:
其中:
第一行 #!/bin/bash 是指这个shell脚本去跑的时候,解释它的解释器是位于/bin目录下的/bash
其他的顾名思义。
最后一行运行成果告知(定义回传值)。例子中,使用exit 0,这代表离开script并且回传一个0给系统。

 

了解脚本的运行方式的差异
1.利用直接运行的方式来运行脚本
使用这种执行方式时,脚本是在子程序的bash内运行的,并且当子程序完成后,在子程序内的各项变量或动作将会结束而不会传回到父程序中。

在这里插入图片描述
当你使用直接运行的方法来处理时,系统会开辟一个新的bash来运行sh02.sh里面的命令。因此firstname、lastname等变量其实是在图中的子程序bash内运行的。当sh02.sh运行完毕,子程序bash内的所有数据便被移除,因此上面的练习中,在父程序下面执行echo $firstname时,就看不到任何东西了。如下图所示。
在这里插入图片描述

2.利用source运行脚本:在父程序中运行
如果使用source来运行命令,那会出现什么情况呢?请看下面的运行结果:
在这里插入图片描述

 
shell脚本的执行

Shell脚本的执行有以下几种方式:

  • sh 脚本名 [参数]
  • sh < 脚本名
  • 改权限后直接执行的方式
chmod a+x test // 给所有用户增加对test脚本的执行权
./test         // 执行test脚本
  • 复制Shell脚本到命令目录/bin下,然后在提示符后面直接输入脚本名就可以直接执行该文件。

对shell script进行追踪与调试
cript在运行之前,最怕的就是出现语法错误问题了!
下面就直接以bash的相关参数来进行判断语法错误,其格式如下。
sh [-nvx] xxx.sh
选项与参数:
-n:不执行script,仅查询语法的问题,没有输出什么说明没问题
-v:在执行script前,先将script的内容输出到屏幕上。(一步一步执行)
-x:将使用到的script内容显示到屏幕上,这是很有用的参数!(一步一步执行)

 
 

Shell中的变量

系统变量
1、Shell中可写的环境变量

在这里插入图片描述2、Shell中只读的参数
我们可以在我们的shell脚本中写入如下的参数,之后可以进行输出
在这里插入图片描述
解释:
在这里插入图片描述

 

用户自定义变量
用户自定义变量,无需进行声明和初始化,区分大小写,为进行初始化的变量,默认值为空字符串。
字符串定义方式

在Linux中,直接
变量名=字符串

在这里插入图片描述
这里需要注意的是:定义的时候不能有空格,如上图,而且我们在使用echo输出值的时候,我们必须加$符号。

引用变量的值:通过在变量名(name)前加 $ 字符(如$name)引用变量的值。

如果在变量的赋值过程中,会出现空格、制表符、换行符,那么我们需要用双引号把这个值给包括起来。

在这里插入图片描述
变量名可以作为长字符串中的一部分:
如果它在字符串的末尾,那么可以直接使用字符串+$变量名的形式
如果它再字符串中的开头或者是字符串的中间 ,那么我们需要使用{ }把变量名给括起来

在这里插入图片描述
在这里插入图片描述
注意不要忘记加 $ 符号。我们在程序中要使用变量值时,要在变量名前面加上一个 符号,这个 符号,这个 符号,这个符号告诉shell,要取出气候变量的值。
 

Shell变量的查看

  • 使用env命令可以查看环境变量
  • 使用set命令可以显示“shell”变量名以及他们的参数

env命令

env命令

set命令不加参数
在这里插入图片描述

  • 查看PATH:echo $PATH
    在这里插入图片描述

 
 

Shell中的特殊字符

通配符

Shell中的通配符如下:

  • 星号(*):代表匹配人员个字符串,在搜索文件中经常使用
  • 问号(?):匹配任意一个字符
  • 方括号([ ]):匹配方括号中所限定的任何一个字符
  • 方括号感叹号([ ! ]):表示不包括在方括号中所列出的字符
     

双引号

由双引号括起来的字符,除了$、``、/仍保留其特殊功能外,其他的都作为普通字符对待。

在这里插入图片描述
 

倒引号(``)

由倒引号括起来的字符被Shell解释为命令。
在这里插入图片描述
倒引号嵌套时必须在内存的倒引号之前加上\进行转义
在这里插入图片描述

 

顺序分隔符(;)

在一行中输入多条命令要使用分好隔开:
在这里插入图片描述
 

管道符

管道符前面的一条命令的结果作为后面的一条命令的输入。

 

逻辑与(&&)和逻辑或(||)

逻辑与:只有前n-1个命令都正确执行之后,第n个命令才能执行。
逻辑或:前面一条命令执行不成功,就执行后面的一条命令,若前面的执行成功,那么就不执行后面的命令。

 
 

Shell中的输入输出命令

这里先介绍一下重定向:重定向就是不使用系统的标准输入端口、标准输出端口或标准错误端口,而进行重新的指定,所以重定向分为输入重定向、输出重定向和错误重定向。通常情况下,重定向到一个文件。在shell中,要实现重定向主要依靠重定向符,即shell是检查命令行中有无重定向符来决定是否需要实施重定向。
注意:>这个是覆盖的操作,>>是追加的操作

在这里插入图片描述
wc命令:wc命令用来计算数字,可以计算文件的Byte数、字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据。
下面的是行数、字符数、子节数
在这里插入图片描述

在这里插入图片描述

Shell进程运行时自动打开三个文件,这些文件称为命令的标准文件,分别用于命令输入、输出结构以及输出错误消息。

command < input-file,如:sh < test1相当于sh test1 ,shell解释并执行test1脚本
command > output-file,
如:cal 2023 > f1 将2023年的日历存入文件f1中
如:cat > f2 新建文件f2,内容有键盘输入。

command >> output-file,如ls -l >>f2,将ls输出的结果附加到文件f2的后面

输入输出命令:
1、read命令:read 变量1 [变量2]

read -p "Please input your first name: " firstname
-p参数提示输入信息
在这里插入图片描述
 

2、echo命令:echo [-n] 参数1 参数2
说明:
-n :不要在最后自动换行

 
 

Shell中的程序控制语句

if语句
格式:
if 判断条件1
then 命令1
elif 判断条件2
then 命令2

else 命令3
fi

练习:输入一个1—10之间的一个数,判断它是否小于5

在这里插入图片描述

注意上面的是错误的,判断条件[ ]里面,我们需要注意空格,各个字符之间要空出来,首尾也要空出来。正确的如下:
在这里插入图片描述
 

测试语句

test表达式和[expression]是等价的:既test = [expression]
前面使用 [ “ a " − l t 1 − o " a" -lt 1 -o " a"lt1o"a” -gt 10 ]就是test测试表达式,test命令是用来检查某个条件算法成立,它可以用于对数组、字符和文件三个方面进行测试。
常用数值参数:

  • eq:等于
  • ne:不等于
  • gt:不等于
  • ge:大于等于
  • lt:小于
  • le:小于等于

注意:
在使用test ,变量用使用 [ x x x ] 来取。在使用 [ ] , 变量要使用 " [xxx]来取。 在使用[ ],变量要使用" [xxx]来取。在使用[],变量要使用"xxx"来取。
在这里插入图片描述
在这里插入图片描述
 

常用字符串参数:

  • =:等于
  • !=:不等于
  • z:字符串长度为0则为真
  • n:字符串长度不为0则为真

[ -z “abcd”]
 

常用文件参数:

  • e 文件名:文件存在则为真
  • r 文件名:文件存在且可读为真
  • w 文件名:文件存在且可写为真
  • x 文件名:文件存在且可执行为真
  • d 文件名:文件存在且为目录为真
  • f 文件名:文件存在且为普通文件为真
  • c 文件名:文件存在且为字符型文件为真
  • b 文件名:文件存在且为块文件为真

另外,Shell 还提供了与( -a )、或( -o )、非( ! )、()四个逻辑操作符用于将测试条件连接起来,其优先级为: ()最高, !、 -a 次之,-o最低。
注意:括号前要有空格并用转移字符“(”和“)”来处理

在这里插入图片描述
 

case语句
case语句的基本格式:

case string1 in
str1)
   command-list;;
str2)
  command-list;;
strn)
  command-list;;
esac

在这里插入图片描述
在这里插入图片描述
 
for语句

for valuaible [argument-list]
do
  command-list
done

如果[argument-list]是变量值表,那么valuaible 会依次取值表中的值。
在这里插入图片描述

在这里插入图片描述

如果[argument-list]是文件表达式,valuaible会取当前或者是指定目录下与文件表达式相匹配的文件名。
在这里插入图片描述

在这里插入图片描述
 

在这里插入图片描述

for循环的另一种写法

for ((初始值;限制值;步长))
do
  程序段
done

在这里插入图片描述

 
while语句
while语句格式:

while 表达式
do
   command-list
done

在这里插入图片描述
我们要取出一个变量的值,并且±*/的话,要使用倒引号,并且使用expr:expr $xxx +-*/ number
由倒引号括起来的字符被Shell解释为命令。
在这里插入图片描述

在数值的运算上,建议使用下面的方式进行运算:
var=$((运算内容))  , 例如:total=$(($firstnu*$secnu))

while测试:

在这里插入图片描述

在这里插入图片描述
 
until语句
until语句格式:

util 表达式
do
    command-list
done

说明:until表达式当表达式的值为false时才执行

在这里插入图片描述
在这里插入图片描述

break可以从循环体中跳出来。
continue的意义也不变。

在这里插入图片描述

Shell 基础(补充)

管道符和grep的使用

管道符:许多Linux命令具有过滤特性,即一条命令通过标准输入端口接收一个文件中的数据,命令执行后产生的结果数据又通过标准输出端口送给后一条命令,作为该命令的输入数据。后一条命令也是通过标准输入端口接收输入数据。
shell提供管道命令“|”将这些命令前后衔接在一起,形成一个管道线。格式为

命令1|命令2|...|命令n

管道线中的每一条命令都作为一个单独的进程运行,每一条命令的输出作为下一条命令的输入。由于管道线中的命令总是从左到右顺序执行的,所以管道线是单向的。
 

在这里插入图片描述
 

例如:set | grep -n “PATH=”
将set命令得出的内容,根据grep 后面写出的字符串进行过滤,-n表示显示行号

例如:我们从一个文件中,查询有i的内容
grep -n “i” /test/grep1

 

在这里插入图片描述
 
无论大小写都显示出来:-i

那么,如果我们要反向选择,将不包含i的内容显示出来,那么我们就在参数上加上一个 -v
grep -v “string” 将不包含string的内容显示出来
 
在这里插入图片描述
 
正则表达式
如果我们要在我们的我们筛选出的内容前面不含某个字符,我们需要使用正则表达式:
1、查找特定字符串。
2、利用中括号[ ]来搜寻集合字符
3、行首与行尾字节分别为 ^、$
4、任意一个字符“.”与重复字节"*"
星号( * ):代表重复星号前一个字符重复0次到无穷多次
 
在这里插入图片描述
 
小写英文、大写英文、数字可以使用[a-z][A-Z][0-9]来书写
假设前面不需要有小写英文:[^a-z]i
 
在这里插入图片描述

 
如果需要显示出带有数字的行,需要:[0-9]
 
在这里插入图片描述
 

如果需要列出首先是某个字符如b的,可以这样 “^b”
 

在这里插入图片描述
 

如果需要列出行首是英文字母开头的的,可以这样

 
在这里插入图片描述
 
如果需要列出行首不是英文字母开头的的,可以这样
 
在这里插入图片描述
 

如果需要列出行尾是以数字开头的,那么需要输入以下命令

 
在这里插入图片描述
 
在这里插入图片描述
 
至少需要两个o以上的字符串时,就需要使用ooo*,既
 
在这里插入图片描述
 
如果想要字符串开头和结尾都是g,但是两个g之间仅能存在至少一个o,需要使用goog
 
在这里插入图片描述
 
如果想要找出“任意数字”的行列,使用"[0-9][0-9]
"
 
在这里插入图片描述
 

使用{}:限定个数范围的字符。但是{}在Shell里面具有特殊意义,所以需要使用转义字符\来让其去特殊的意义。

假设要找到含有两个o的字符串的行:需要使用"o{2}"
 
在这里插入图片描述
 
假设要找出g后面接2~5个o,然后再接一个g的字符串:需要使用"o{2,5}g"
 
在这里插入图片描述
 
如果想要的是2个o以上的goooo…g呢?需要使用"o{2,}g"

正则表达式汇总:
 
在这里插入图片描述 
在这里插入图片描述

 

more命令
概念—>逻辑模型—>物理模型图

像我们要做一个后端项目–>我们首先需要设计数据库–>设计数据库–>我们就需要对事务进行抽象
那么,我们从哪里抽象呢?

根据前端原型进行抽象,然后根据PowerDesigner在设置类和类之间的关系,然后生成表—>

之后就是技术选型了---->然后开发

熔断:秒杀!
用hystrix线程池给定坑位,然后其他的返回已经抢不到了。

面试造飞机大炮火箭、进场拧螺丝。那之前还要过笔试。
直到现在,你才知道你有多烂!
更新数据

 
 
 
 
  
  
  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/418318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

synchronized原理详解

众所周知&#xff0c;使用多线程可以极大地提升程序的性能&#xff0c;但如果多线程使用不合理&#xff0c;也会带来很多不可控的问题&#xff0c;例如线程安全问题。 什么是线程安全问题呢&#xff1f;如果多个线程同时访问某个方法时&#xff0c;这个方法无法得到我们预期的…

同步FIFO、异步FIFO详细介绍、verilog代码实现、FIFO最小深度计算、简答题

文章目录前言一、多bit数据流跨时钟域传输——FIFO1、FIFO分类2、常见参数3、与普通存储器的区别4、FIFO优缺点二、同步FIFO1、计数器法2、高位扩展法3、单端口和双端口RAM3.1 单端口RAM3.2 双端口RAM4、例化双端口RAM实现同步FIFO三、异步FIFO1、格雷码1.1 二进制和格雷码之间…

spring5(五):AOP操作

spring5&#xff08;五&#xff09;&#xff1a;AOP操作前言一、代理模式1、场景模拟2、代理模式2.1 概念2.2 静态代理2.3 动态代理二、AOP概述1、什么是 AOP?2、相关术语3、作用三、AOP底层原理1、AOP 底层使用动态代理2、AOP&#xff08;JDK 动态代理&#xff09;2.1 编写 J…

VR全景展示,VR全景平台,助理全景展示新模式

引言&#xff1a; VR全景展示是一种新型的展示方式&#xff0c;它利用虚拟现实技术和全景拍摄技术&#xff0c;使参观者可以身临其境地进入虚拟展览空间。这种展示方式不仅能够提供更加沉浸式的参观体验&#xff0c;还可以解决传统展览所面临的时间和地域限制等问题。 VR全景展…

【Java实战篇】Day7.在线教育网课平台

文章目录一、需求&#xff1a;课程审核1、需求分析2、建表与数据模型3、接口定义4、Mapper层开发5、Service层开发6、完善controller层二、需求&#xff1a;课程发布1、需求分析2、建表与数据模型3、技术方案4、接口定义5、消息处理SDK6、Mapper层开发7、Service层开发8、页面静…

unity,射手游戏

文章目录介绍一&#xff0c;制作玩家具体函数脚本PlayerCharacter三、 制作玩家控制脚本 PlayerController&#xff0c;调用上面的函数方法四、 制作子弹脚本 shell五、 给玩家挂载脚本六、 制作坦克脚本七、 给坦克添加组件八、 开始游戏&#xff0c;播放动画九、 下载介绍 3…

seata学习笔记

Seata 官网&#xff1a; https://seata.io/zh-cn/index.html 是什么&#xff1f; Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式…

MySQL中的float类型慎用!慎用!慎用!

在前端输入一串数字后有时候展示值与输入的内容一致&#xff0c;有时候却不一致。经分析&#xff0c;原来是MySQL数据库中字该字段的类型是float&#xff0c;该字段的值超过6位有效数字后就会进行四舍五入截取&#xff0c;举例来说&#xff1a;假设float类型字段的输入值是1234…

十八、MySQL 变量、分支结构IF、CASE...WHEN详解

文章目录一、变量1.1 系统变量1.1.1 系统变量分类1.1.2 查看系统变量1.2 用户变量1.2.1 用户变量分类1.2.2 会话用户变量1.2.3 局部变量1.2.4 对比会话用户变量与局部变量二、定义条件与处理程序2.1 案例分析2.2 定义条件2.3 定义处理程序2.4 案例解决三、流程控制3.1 分支结构…

[C++]类与对象下篇

目录 类与对象下篇&#xff1a;&#xff1a; 1.再谈构造函数 2.static成员 3.友元 4.内部类 5.匿名对象 6.拷贝对象时的编译器优化 7.再次理解封装 8.求12...n(不能使用乘除法、循环、条件判断) 9.计算日期到天数的转换 10.日期差值 11.打印日期 12.累加天数 类与对象下篇&…

数据结构与算法七 堆

一 堆 1.1 堆定义 堆是计算机科学中一类特殊的数据结构的统称&#xff0c;堆通常可以被看做是一棵完全二叉树的数组对象。 堆的特性&#xff1a; 它是完全二叉树&#xff0c;除了树的最后一层结点不需要是满的&#xff0c;其它的每一层从左到右都是满的&#xff0c;如果最后…

4月最新编程排行出炉,第一名ChatGPT都在用~

作为一名合格的&#xff08;准&#xff09;程序员&#xff0c;必做的一件事是关注编程语言的热度&#xff0c;编程榜代表了编程语言的市场占比变化&#xff0c;它的变化更预示着未来的科技风向和机会&#xff01; 快跟着一起看看本月排行有何看点&#xff1a; 4月Tiobe排行榜前…

【CSS】使用 固定定位 实现顶部导航栏 ( 核心要点 | 固定定位元素居中设置 | 代码示例 )

文章目录一、核心要点分析1、顶部导航栏要点2、固定定位垂直居中设置二、代码示例一、核心要点分析 实现下图所示功能 : 上方有一个固定导航栏 , 水平居中设置 ;左右两侧各一个广告栏 , 垂直居中设置 ; 1、顶部导航栏要点 顶部导航栏要点 : 使用固定定位 , 上边偏移设置为 0 …

Linux Ubuntu虚拟机下载安装以及初始配置--VMware、Ubuntu、Xshell、Xftp

一、下载准备 Ubuntu系统下载链接&#xff08;系统本身&#xff09;&#xff1a;官网链接 VMware虚拟机下载链接&#xff08;搭载Ubuntu系统&#xff09;&#xff1a;网盘链接密码XMKD Xshell下载链接&#xff08;虚拟机远程连接&#xff09;&#xff1a;官网链接 Xftp下载…

MySQL索引数据结构入门

之前松哥写过一个 MySQL 系列&#xff0c;但是当时是基于 MySQL5.7 的&#xff0c;最近有空在看 MySQL8 的文档&#xff0c;发现和 MySQL5.7 相比还是有不少变化&#xff0c;同时 MySQL 又是小伙伴们在面试时一个非常重要的知识点&#xff0c;因此松哥打算最近再抽空和小伙伴们…

PyQt5学习笔记一、安装PyQt5和在PyCharm中配置工具

一、安装PyQt5 1. 可以在cmd窗口安装PyQt5和工具 可以在cmd窗口使用命令 pip install PyQt5 安装PyQt5&#xff0c;若指定版本使用命令 pip install PyQt5version&#xff0c;此时同时安装了PyQt5和sip。参考链接 在cmd命令窗口安装Python模块_Mr. 李大白的博客-CSDN博客htt…

potPlay——记忆播放位置、各种快捷键

potPlay——记忆播放位置、各种快捷键potPlay——各种快捷键简洁版完整版快捷键列表potPlay——记忆播放位置potPlay——各种快捷键 简洁版 Q 复位 亮度&#xff0c;对比度&#xff0c;色度复位键 W/E 调暗/调亮 R/T 对比度 Y/U 饱和度 I/O 色彩度 D 上一帧 F 下一帧 M 静音 …

Docker开启并配置远程安全访问

前言 在工作学习中&#xff0c;为了提高项目部署效率&#xff0c;一般会在Idea中直接使用Docker插件连接服务器Docker容器&#xff0c;然后将项目打包与DockerFile一起build成Docker镜像部署运行。但是不可能服务器总是跟着主机的&#xff0c;因此呢时常会面临的一个问题就是从…

【微信小程序】-- uni-app 项目--- 购物车 -- 配置 tabBar 效果(五十一)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

事务的ACID特性

1. 絮絮叨叨 重温Apache ORC时&#xff0c;发现ORC支持ACID想起自己之前一度不知道ACID是哪些单词的缩写&#xff0c;更别提面试中常提到的事物隔离级别等知识了因此&#xff0c;特地学习一下数据库中事务的ACID 2. ACID 2.1 What’s transaction&#xff1f; 考虑一个真实…