目录

Linux中的Shell编程

Linux中的Shell编程

1.Shell的概念

shell是一个命令行解释器,它为客户提供了一个Linux内核发送请求一边运行程序界面系统级程序,用汉语可以通过shell启动、挂起、停止甚至编写一些程序。

shell还是一个功能强大的编程语言,易于编辑,易于调试,灵活性强,shell是结识知识性的脚本语言,在我们shell中直接调用Linux的系统命令操作即可。

2. Shell的分类

(1)Bourne Shell(bshell)

从1979年在unix系统就开始使用了。

它的主要文件是:sh,bash,zsh,psh

(2)C Shell(cshell)

只是一个升级的版本

它的主要文件是:csh,tcsh

注意问题:bshell和cshell是不能兼容,它们之间是独立的

bash和sh是可以互相兼容的

3. Linux中支持的shell

(1)查看Linux中的shell脚本

https://i-blog.csdnimg.cn/blog_migrate/effe70e7aae153cee55badcfd04e7e6d.png

4. Shell脚本的执行方式

(1)回显的命令:echo

https://i-blog.csdnimg.cn/blog_migrate/33c4cf665d052dc22988bcad8b62ce24.png

(2)在Linux的家目录下创建sh目录存放脚本语言

https://i-blog.csdnimg.cn/blog_migrate/8a59d7d941aceb5dcd78b3e6146bda8b.png

(3)在sh目录下写一个.sh类型的shell脚本语言hell.sh

https://i-blog.csdnimg.cn/blog_migrate/4b2d5413d48810313ad9d047504cd124.png

(4)执行写好的脚本语言:bash或sh命令

通过路径的方式:bash或sh

相对路径执行shell脚本

https://i-blog.csdnimg.cn/blog_migrate/16fa54283510a0606bb8986ac20998e5.png

绝对路径执行shell脚本

https://i-blog.csdnimg.cn/blog_migrate/e9cb8970a8c394ce1bf1cdca74796ed1.png

通过可执行文件的方式

相对路径的方式

https://i-blog.csdnimg.cn/blog_migrate/8078822e471501c5ff8ac33ad60e0a74.png

绝对路径的方式

https://i-blog.csdnimg.cn/blog_migrate/225ad70532b6a912da77841e7b5a6303.png

5. Shell中变量(4种)

(1)用户自定义的变量

只能在当前的shell中使用,常用的调用命令echo $变量名

(2)定义一个简单的变量

https://i-blog.csdnimg.cn/blog_migrate/cf1ca696639e92abb031259184075f3a.png

(3)变量的叠加方式1

https://i-blog.csdnimg.cn/blog_migrate/f12fbc8b0e9cc899d558ffda966d1703.png

(4)变量的叠加方式2

https://i-blog.csdnimg.cn/blog_migrate/1a07355276da859180386a43b4ca063d.png

(5)查看变量:set

https://i-blog.csdnimg.cn/blog_migrate/6cc45f7898f8f733cd0bc4e990683570.png

https://i-blog.csdnimg.cn/blog_migrate/b85e0e2b7789e705bb35fe4b9068051e.png

(6)变量的删除:unset 变量名

https://i-blog.csdnimg.cn/blog_migrate/61d5bd38696b57906220281b14acd650.png

(7)环境变量(系统运行时所用到的变量)

特点:a:它不仅在当前的shell中有效,在子shell中都有效

b:如果把环境变量写道指定的文件中,那么该环境变量在所有的shell中都生效。

举例说明:

声明一个环境变量:export 变量名=变量值。

查看环境变量:env

https://i-blog.csdnimg.cn/blog_migrate/223a32ac4cda58354a28d56019891eb8.png

https://i-blog.csdnimg.cn/blog_migrate/c26d9f695d8ae1e43a123ddcb3b7e4a4.png

删除环境变量:unset 环境变量名称

https://i-blog.csdnimg.cn/blog_migrate/faa068c574dc6478309c5ce61a03d440.png

(8)位置变量

获取执行脚本文件时传入的参数,将传入的参数保存在位置变量种,以便脚本种可以使用这些变量

(9)预定义变量

$0:脚本的名称

$!:进程种PID号,每一个进程都有一个编号

$$:当前进程的ID号

$#:当前shell的参数个数

$*:整体显示所有的参数

$@:逐个显示所有的参数

$?:判断表示程序退出的代码,返回0代表成功,返回非0代表失败

https://i-blog.csdnimg.cn/blog_migrate/5e4e473205ca99c7c97d2b4ac896fcf2.png

正确退出显示0

https://i-blog.csdnimg.cn/blog_migrate/0ec519a5756b4322a0427443f2c01852.png

https://i-blog.csdnimg.cn/blog_migrate/7bcd70580ea91a7e2cc7cc92318d2870.png

错误退出显示非0

https://i-blog.csdnimg.cn/blog_migrate/3fabf2736d2dbd58e2f0841020b373db.png

$#的使用

https://i-blog.csdnimg.cn/blog_migrate/90dd87c08a7d6f70449167065528563c.png

*$的使用

https://i-blog.csdnimg.cn/blog_migrate/47815cc6e1aeb2b8a4a8ecfb695eabec.png

$@的使用

https://i-blog.csdnimg.cn/blog_migrate/cf185de69d85a03cc01f66eec8acdca4.png

6. Shell中逻辑符号

(1)逻辑与:&&

前面的命令执行成功后才能执行后面的命令

https://i-blog.csdnimg.cn/blog_migrate/9125775ad41aa4baddfa6b64171603aa.png

(2)逻辑或:||

前面的一个命令执行失败会执行后面

https://i-blog.csdnimg.cn/blog_migrate/982046fdc3467728cdc8d5eccc51ada3.png

前面的命令执行成功后面的就短路

https://i-blog.csdnimg.cn/blog_migrate/4dda1a7ea64b7fbd2a52ec7ed7e98291.png

(3)无逻辑符号

多个命令顺序执行,命令之间没有任何逻辑关系

https://i-blog.csdnimg.cn/blog_migrate/3ca932c2d29bc344db04c132202ec3e8.png

7. Shell的算数运算

(1)declare命令:说明变量类型

选项:+:取消变量的类型属性

-:给变量设定类型属性

i:将变量声明为整数类型

x:将变量声明为环境变量

p:显示指定变量被声明的类型

举例说明:数值运算方法1(推荐)

https://i-blog.csdnimg.cn/blog_migrate/c3e9a06d544c7ce94870bafa3010f8c5.png

举例说明:数值运算方法2(不推荐)

https://i-blog.csdnimg.cn/blog_migrate/5d0c2562a02d6042a6651cb0ed4f851a.png

举例说明:数值运算方法3(推荐使用)

https://i-blog.csdnimg.cn/blog_migrate/50ddea0d2014929b8bd474ad607168f5.png

举例说明:数值运算方法4(推荐使用)

https://i-blog.csdnimg.cn/blog_migrate/1f26c9fcc422c9175e73dff778c4f9c9.png

8. 内置测试的判断

定义字符串必须加上双引号

https://i-blog.csdnimg.cn/blog_migrate/883c26a63bbbe37eabd566a77c2e8811.png

判断字符串之间是否相等,必须加上双引号

https://i-blog.csdnimg.cn/blog_migrate/85c2d5a9f12cc1ffbcb6377f62f24131.png

-e 文件名:如果文件存在则为真0

-r 文件名:如果文件存在且可读为真0

-w 文件名:如果文件存在且可写为真0

-x 文件名:如果文件存在且可执行则为真0

-a 文件名:and

-o:文件名:or

https://i-blog.csdnimg.cn/blog_migrate/fe8761a4418921d8455bd26ae665b1f8.png

补充1:用于数值的比较的选项

-eq:等于

-gt:大于

-lt:小于

-ne:不等于

-ge:大于等于

-le:小于等于

https://i-blog.csdnimg.cn/blog_migrate/65457fb311e80fb7ed15d8f8b93a6322.png

补充2:用于字符串:分为5种比较方式

= 等于

!= 不等于

-z:长度为0则为true

-n:长度不位0则为true

str:字符串不为空则为true

https://i-blog.csdnimg.cn/blog_migrate/5b54243f734b376685786ddb2a87bcb9.png

https://i-blog.csdnimg.cn/blog_migrate/faf4ea0c3e13f6571f49fc01e9686e7e.png

补充3:文件的测试或比较

-d:如果是目录则为true

-f:如果是文件则为true

-r:如果是可读则为true

-w:如果是可写则为true

-x:如果是可执行则为true

https://i-blog.csdnimg.cn/blog_migrate/771ad07992f60985de6cce6bacf900c4.png

可以使用test测试

https://i-blog.csdnimg.cn/blog_migrate/261984d318a263b44647666a351b3ae6.png

9. Shell的控制语句

(1)if控制语句

if 条件判断

then 内容

fi

目录不存在就创建该目录

目录存在就显示目录种的文件和目录

https://i-blog.csdnimg.cn/blog_migrate/84fd039b484670b481d4cb870c87e902.png

判断score的等级

https://i-blog.csdnimg.cn/blog_migrate/1f2738bb489282c104c3c15e5d055d1c.png

(2)for循环控制语句

for [ 循环的条件:循环控制]

do

循环体

done

https://i-blog.csdnimg.cn/blog_migrate/1d9aa3a9b490589dde5521c9afe9c43a.png

循环月份:

https://i-blog.csdnimg.cn/blog_migrate/94279a93005058dfc32ca5808e5745a4.png

(3)while循环控制语句

while [循环条件]

do

[循环体]

[循环控制]

done

https://i-blog.csdnimg.cn/blog_migrate/68342bbdfa332d467a7059b555c5db36.png

(4)case控制语句

https://i-blog.csdnimg.cn/blog_migrate/373c1633fd05424acafcba86bd3af65f.png

case的另外一种编写方式

https://i-blog.csdnimg.cn/blog_migrate/785f397c5a5b3bfd2f6c3a443fcff54d.png