简介:
shell编程的基本概念,定义变量,运算符,条件判断的基本使用
shell编程
把多个命令写到一个文件里,这个文件就是脚本,里面还有很多的流程控制
基本概念
脚本的后缀名是.sh
脚本的执行:
- sh+脚本的路径,bash+脚本的路径
- 直接脚本的路径,但是需要权限
- 文件名前面加.(点,后面加空格)或者source
简单例子
创建sh文件
touch c.sh
编辑文件
使用vim打开文件
vim c.sh
编辑内容:
#! /bin/bash
echo "hello world"
注意,sh文件开头第一句都是#!/bin/sh
:默认选择的命令行解析器
执行sh文件:
第一种方式:
bash c.sh
第二种方式:
./c.sh
如果直接打文件名,是不行的,要加上绝对路径或者相对路径才行
而且需要有文件的执行权限,如果提示权限不足,需要修改文件的权限。
chmod +x c.sh
注意:第一种和第二种执行sh脚本文件是会开启一个子shell来执行的,有可能会不能对父shell起作用
第三种执行方式是直接在当前的shell中执行的
开不开子shell,区别是:环境变量的继承关系,如果在子shell中设置当前变量,父shell中是不可见的。
变量
变量根据定义分为:系统变量和用户自定义变量
根据作用范围分为:全局变量和局部变量,全局是所有的shell起效,局部是只针对当前shell起效
**扩展:**当前shell可以使用ps -f
查看
开启一个子shell,bash
,然后再执行ps -f
,可以看到这个bash的PPID就是第一个bash的线程id
关于怎么知道当前的shell是哪个shell,可以看命令的PPID是哪个shell的进程号
可以使用exit退出当前的bash,回到上一级的bash(父bash)
查看全部的系统全局变量
env | less
也可以直接输出,echo $HOME
自定义变量
直接变量名=值,回车,不能有空格
更改也是直接变量名=值,回车,不用管值的类型的,默认都是string类型。
注意:
- 如果值是一个字符型,可以加引号
- 这种直接赋值创建的是局部变量
把局部变量变成全局变量
export 变量名
但是使用这个命令,让子shell的局部变量变成了全局变量,虽然父shell可以访问到,但是在子shell中修改了这个变量的值,在父shell中,虽然还是可以访问到,但访问到的值不是修改后的值。
只读变量
只能读,不能修改,也就是不能重新赋值
readonly b=3
撤销变量
unset 变量名
这个命令不能撤销只读变量
特殊变量
${数字}
可以给脚本传递参数,写在脚本中,${0}是脚本的名称,所以传参使用的事1开始的。
vim d.sh
编辑脚本
#! /bin/bash
echo "hello world"
echo "hello, ${1}"
运行脚本的时候,传入参数
$#
获取输入参数的个数
可以用在循环或者是参数的判断
编辑脚本
#! /bin/bash
echo "--------------------特殊变量#-------------------"
echo $#
运行脚本
这个1就表示输入了一个参数
$*和 $@
$*:表示命令行中所有的参数
$@:表示命令行中所有的参数
功能类似,区别在于 $ * 获得的参数是当成一个整体(相当于字符),@获得的参数是当成多个(相当于数组)。
$?
最后一次执行的命令的返回状态,0表示执行正常,非0表示错误。
它是直接在命令行使用的
运算符
定义的变量的值如果想做运算,可以使用$((运算式))或者 $[运算式]
脚本中计算
vim编辑add.sh脚本
#!/bin/sh
#!/bin/sh
sum=$[$1+$2]
echo sum=$sum
运行add.sh脚本
. add.sh 3 3
运行结果
流程控制
条件判断
第一种方式:test $a = 3
第二种方式:[ $a = 3 ]
然后使用echo $?,如果返回值为0,则相等,返回值为1,则不相等。
注意:[ $a = 3 ],表达式前后都要有空格,等号两边也是要空格的,如果等号两边没有空格,会识别为一个变量名,如果里面随便输入值,也会判断为0,只有[]里面没有值的时候,才会判断为1。
常用的判断条件
整数的判断:
-eq | 等于 |
-ne | 不等于 |
-lt | 小于 |
-le | 小于等于 |
-gt | 大于 |
-ge | 大于等于 |
字符使用 = 判断相等,!= 判断不等
[ $a -lt 5 ]
判断变量a是否小于5
文件权限的判断:
-r | 有读的权限 |
-w | 有写的权限 |
-x | 有执行的权限 |
[ -x add.sh ]
判断add.sh有没有读和执行的权限(上图中可以看到有读没有执行)
对文件类型进行判断:
-e | 文件是否存在 |
-f | 文件是否存在并且是否是一个普通文件 |
-d | 文件是否存在并且是否是一个目录 |
[ -d add.sh ]
判断add.sh是否是一个目录
多条件判断:
&&:前一条命令成功,才执行后面的命令
||:前一条命令失败,才执行后面的命令
例子:
[ abcabc ] && echo "yes" || echo "no"
[ ] && echo "yes" || echo "no"
运行结果: