# 第一行:幻数
- #!/bin/sh(是Bash的软链接)
- #!/bin/bash(推荐)
内核会根据它来确定使用什么解释器来执行它,不写不规范。
如果没有设置Linux默认解释器是什么就用什么来解释
# 环境变量
## 一般定义
在/etc/profile(全局变量下)
>export 变量=值
注意:export意味着所有终端都生效,是真正的全局。
为了规范和避免未知错误,最好加上。
如果不加就是在当前终端或者当前脚本中生效,关闭终端或执行完脚本失效。
## 激活变量
>source /etc/profile
>. /etc/profile
**注意**:环境变量文件是无法用sh激活的,只有用.和source
经典题:
echo "user=`whoami`"> a.sh
sh a.sh && echo $user
**这道题就是用sh激活环境变量,是绝对不行的**
应该是:source a.sh && echo $user
而且如果永久使用user=`whoami`前要加export
## 在Shell脚本中定义
```
a=192.168.1.1
b="192.168.1.1"
c='192.168.1.1'
echo "a=$a"
echo "b=$b"
echo "c=${c}"
```
特性:
单引号定义变量:所见即所得
>c='192.168.1.1'
## 特殊变量和环境变量
- $0 获取当前执行脚本的文件名,可以包括脚本路径
- dirname,basename。配合$0使用
- $n 获取脚本的第n个参数值
- $# 获取脚本总共传了几个参数
- $? 查看上个语句返回值,默认返回值如下
- 0:正确 2:权限拒绝 1-125:执行失败(脚本问题) 127:命令输入错误 >=128:执行中取消
- exit 1 指定脚本返回值
- shift 把第n+1参数变为第n个参数,第一个参数消失。场景:使用过的参数就删除(一次性筷子)
- $@ //获取当前脚本的所有传参的参数当成字符串:不合并他们为完整字符串
- $* //获取当前脚本的所有传参的参数当成字符串:把他们合并成完整字符串
- $$ //当前shell进程号
### 简单使用
>sh jiaoben.sh "我是第一个参数" "我是 第二个参数" 我是第三个参数
```
echo "$0"
dirname $0
basename $0
echo "$1"
echo "$3"
echo "$#"
echo "$3"
echo "$$"
for i in "$*";do echo $i;done
for i in "$@";do echo $i;done
```
### 升级使用
>sh pidjiaoben.sh
```
```
## 比较参数
- expr 适合校验文件扩展名:`if expr "$1" : ".*\.pub"; then`
- expr 还可以检验是不是整数、分数
- -eq
- -lt
- -gt
- -a 并且:\[ -n "内容" -a "内容"="内容" \]
- -o 或者
- -n 为空:\[ -n "内容" \] && {执行内容}
- -z 为整数
```
expr "test.pub" : ".*\.pub" && echo 1 || echo 0
```
## 变量替换(备胎功能)
>result=${test:=hello}
如果test没有定义值则result显示hello,并且把hello赋值给result
>result=${test:-hello}
如果test没有定义值则result显示hello,不把hello赋值给result
test如果在之前被定义过则显示定义结果(test=abc;result=${test:-hello};显示为abc)
但如果在之后才定义test=abc则不行,显示结果还是hello
在脚本中删除文件/文件夹一定要使用它
```
```
## 取消定义变量
>unset result
## 清屏