> 文章列表 > Shell Script

Shell Script

Shell Script

目录

    • 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内运行的,并且当子程序完成后,在子程序内的各项变量或动作将会结束而不会传回到父程序中。

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

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中可写的环境变量

Shell Script2、Shell中只读的参数
我们可以在我们的shell脚本中写入如下的参数,之后可以进行输出
Shell Script
解释:
Shell Script

 

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

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

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

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

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

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

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

Shell变量的查看

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

env命令

Shell Script

set命令不加参数
Shell Script

  • 查看PATH:echo $PATH
    Shell Script

 
 

Shell中的特殊字符

通配符

Shell中的通配符如下:

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

双引号

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

Shell Script
 

倒引号(``)

由倒引号括起来的字符被Shell解释为命令。
Shell Script
倒引号嵌套时必须在内存的倒引号之前加上\\进行转义
Shell Script

 

顺序分隔符(;)

在一行中输入多条命令要使用分好隔开:
Shell Script
 

管道符

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

 

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

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

 
 

Shell中的输入输出命令

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

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

Shell Script

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参数提示输入信息
Shell Script
 

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

 
 

Shell中的程序控制语句

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

else 命令3
fi

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

Shell Script

注意上面的是错误的,判断条件[ ]里面,我们需要注意空格,各个字符之间要空出来,首尾也要空出来。正确的如下:
Shell Script
 

测试语句

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

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

注意:
在使用test ,变量用使用 [xxx]来取。在使用[],变量要使用"[xxx]来取。 在使用[ ],变量要使用"[xxx]来取。在使用[],变量要使用"xxx"来取。
Shell Script
Shell Script
 

常用字符串参数:

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

[ -z “abcd”]
 

常用文件参数:

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

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

Shell Script
 

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

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

Shell Script
Shell Script
 
for语句

for valuaible [argument-list]
docommand-list
done

如果[argument-list]是变量值表,那么valuaible 会依次取值表中的值。
Shell Script

Shell Script

如果[argument-list]是文件表达式,valuaible会取当前或者是指定目录下与文件表达式相匹配的文件名。
Shell Script

Shell Script
 

Shell Script

for循环的另一种写法

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

Shell Script

 
while语句
while语句格式:

while 表达式
docommand-list
done

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

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

while测试:

Shell Script

Shell Script
 
until语句
until语句格式:

util 表达式
docommand-list
done

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

Shell Script
Shell Script

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

Shell Script

Shell 基础(补充)

管道符和grep的使用

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

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

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

Shell Script
 

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

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

 

Shell Script
 
无论大小写都显示出来:-i

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

 
如果需要显示出带有数字的行,需要:[0-9]
 
Shell Script
 

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

Shell Script
 

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

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

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

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

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

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

正则表达式汇总:
 
Shell Script 
Shell Script

 

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

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

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

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

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

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