shell概述
计算机系统:硬件->Linux内核->shell(做一个解释工作)->外层应用程序
shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。
常见的shell解释器:
![](https://i-blog.csdnimg.cn/blog_migrate/49170383067d7eb49455c4aeda407acc.png)
编写最简单的shell脚本
先创建一个文件夹,在文件夹内创建一个shell脚本:
![](https://i-blog.csdnimg.cn/blog_migrate/c9f6bb77ce043bc144a45dd363438a1c.png)
vim hello.sh开始进行编辑
![](https://i-blog.csdnimg.cn/blog_migrate/1619a41b391ed745e1794fbefb97e492.png)
执行shell脚本:bash 路径 / sh 路径
![](https://i-blog.csdnimg.cn/blog_migrate/d46241217b68f8666f2f80a45f9bece2.png)
方法二:直接输入 绝对/相对路径,即可执行
查看当前文件权限,发现不可执行,要先修改文件权限
![](https://i-blog.csdnimg.cn/blog_migrate/7a3213a42f09670be6ffaffd87d59b07.png)
变成可执行文件:
![](https://i-blog.csdnimg.cn/blog_migrate/b87036c3bddc40d8db92ca0afe54af30.png)
相对路径执行脚本:
![](https://i-blog.csdnimg.cn/blog_migrate/b8c19b26416e2f9001ec789fe6302329.png)
绝对路径执行脚本:
![](https://i-blog.csdnimg.cn/blog_migrate/5ee477315f4758d903d2f5e89a16b7ae.png)
方法三:. 或者 source 脚本路径
![](https://i-blog.csdnimg.cn/blog_migrate/8034b4eb533a7480a7601dbc08dabf82.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d1e6216b845ef60bcd5529da6ceb7139.png)
shell中的变量
系统变量
常见的系统变量:$HOME(主目录),$PWD(工作目录),$SHELL(使用的解析器),$USER(当前用户)等。
查看系统某个变量:echo 系统变量
![](https://i-blog.csdnimg.cn/blog_migrate/87137731b8f2e1ca5e3bb4b886465c35.png)
查看全部系统变量:env / printenv
查看所有变量(包括系统的全局变量和局部变量):set
自定义变量
用户自定义变量:变量名=变量值(注意等号前后不能有空格)
![](https://i-blog.csdnimg.cn/blog_migrate/2aa5436a744baa802caa00661cb82308.png)
将自定义变量(局部变量)升级为全局变量:export 变量名
如图所示,自定义变量my_value在新打开的子shell中是查询不到的
![](https://i-blog.csdnimg.cn/blog_migrate/62380d409fb5982ca296602c3736b9cf.png)
升级为系统变量后在子shell中即可查询
![](https://i-blog.csdnimg.cn/blog_migrate/df6973da469b5590f27487da3b0f6575.png)
定义只读变量:readonly 变量
![](https://i-blog.csdnimg.cn/blog_migrate/9f04a43727edb44e419442384467de8e.png)
删除自定义变量:unset 变量名
![](https://i-blog.csdnimg.cn/blog_migrate/a8685935e580e20668366dd5750cb470.png)
只读变量不能unset,关掉终端重新开启,变量就没有了。
特殊变量
$n:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
带参数的脚本:
![](https://i-blog.csdnimg.cn/blog_migrate/ad47cee1451e42b839be9422913c86fc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/acf1c8ca6c8422d9b22b1fd13dafb637.png)
测试特殊符号的使用
![](https://i-blog.csdnimg.cn/blog_migrate/6ee0a5d2329adf15fac18be7ee320f06.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c963548613eba7737ca64cfd4b7f7587.png)
$#:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性。
![](https://i-blog.csdnimg.cn/blog_migrate/f26b593dc7d578ac6cbef2cb609f2e81.png)
![](https://i-blog.csdnimg.cn/blog_migrate/01b63283333d771f75408a38053a197f.png)
$*,$@:
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
![](https://i-blog.csdnimg.cn/blog_migrate/455407a8647433ebb5b4d80ee9925d04.png)
![](https://i-blog.csdnimg.cn/blog_migrate/abc73c0c96ea14788f584f7f543e3bc7.png)
$?:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
![](https://i-blog.csdnimg.cn/blog_migrate/81dfcb31fd3f514bcc9d044b23d52cee.png)
![](https://i-blog.csdnimg.cn/blog_migrate/74b22446a911e96c7b061d1f5e327ead.png)
运算符
基本运算的语法:$[运算表达式] / $((运算表达式))
![](https://i-blog.csdnimg.cn/blog_migrate/97512d9102b8b7640445dc061d0ef993.png)
编写一个简单的脚本程序
![](https://i-blog.csdnimg.cn/blog_migrate/509c1dab7ef3adebb6567f824121d739.png)
条件判断
基本使用语法:test 语句,若当前判断为true,会返回0,否则返回1;查看返回结果使用echo $?
![](https://i-blog.csdnimg.cn/blog_migrate/cb8bd75f0dd8eb693b8aa7f06c711048.png)
判断方法二:[ 语句 ](注意判断语句前后要有空格)
![](https://i-blog.csdnimg.cn/blog_migrate/9811bdf84a9249f065a3d4158d0f1f1f.png)
字符串之间的等或不等直接用“=”或“!=”即可
整数之间的判断
-eq | 等于(equal) | -ne | 不等于(not equal) |
-lt | 小于(less than) | -le | 小于等于(less equal) |
-gt | 大于(greater than) | -ge | 大于等于(greater than) |
![](https://i-blog.csdnimg.cn/blog_migrate/8f752ec3d2a8e9e00ca1ad2b11becfa9.png)
文件的判断
-r | 可读的权限 | -e | 文件存在 |
-w | 可写的权限 | -f | 文件存在且是一个一般文件(file) |
-x | 执行的权限 | -d | 文件存在且是一个目录 |
![](https://i-blog.csdnimg.cn/blog_migrate/0570d9768288cc0167bd3c52458850df.png)
![](https://i-blog.csdnimg.cn/blog_migrate/373db043ec93071f3d475facd4448ca8.png)
多条件判断:&& 和 ||
C语言中的问好表达式:a>b?a=1:b=2在shell中即可用下面形式实现:
[ a -gt b] && res=true || res=false
![](https://i-blog.csdnimg.cn/blog_migrate/120461b36718ea25fd114b3070f5447c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/be0bb0a2e66ef07b6472f210c246ea91.png)
执行原理:&&表示前一条命令执行成功时,才会执行res=true,||表示上一条命令执行失败时,才执行res=false。