目录
- 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命令
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"−lt1−o"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线程池给定坑位,然后其他的返回已经抢不到了。
面试造飞机大炮火箭、进场拧螺丝。那之前还要过笔试。
直到现在,你才知道你有多烂!
更新数据