# shell 脚本
文件后缀.sh
```
#!/bin/bash
//头部文件
```
编写完成保存后给.sh加权限 就可以执行了
```
chmod +x test.sh
//加权限 test.sh是自己编写好保存好的文件
```
本目录下
```
./test.sh //就执行了这个文件
```
# 注释规则:
```
# 注释
```
# 变量声明:
```
变量名=值 // =左右不能有空格
```
# 打印变量值:
```
ceho $变量名
```
# 字符串拼接:
```
$变量1$变量2 //直接挨到一起就行
```
# 获取字符串长度:
```
echo ${字符串变量} //注意字符串变量是不加$符号的
```
# 截取字符串长度:
```
echo ${字符串变量:1:5} //截取第1个字符串到第5个的字符串值
```
# 声明调用数组:
```
变量=(‘值1’‘值2’‘值3’) //声明一个数组
```
```
echo ${变量[0]}
echo ${变量[1]} //打印数组
```
```
echo ${变量[*]}
echo ${变量[@]} //获取数组元素
```
```
echo ${#变量[*]}
echo ${#变量[@]} //获取数组长度
```
# 传值:
```
脚本 参数1 参数2 参数3
接受参数 $1 $2 $3
$# 传递到脚本的参数个数
$$ 脚本运行的当前进程ID号
$? 显示最后命令的退出状态。 D表示没有错误,其他任何值表明有错误。
```
# 重定向:
```
>输出重定向
>输入重定向
echo 新文件 > 要覆盖的文件 //输出重定向
```
```
定时任务
/dev/null/2>&1
```
# 判断:
```
if[ 变量 == 值 ] //这个地方要有空格[ ]里
then
echo "输出的条件"
fi
```
```
运算符
-eq等于 -ne 不等于 -gt大于 -lt小于 -ge大于等于 -le小于等于
逻辑运算符
!取反 -o 或 -a且
```
## **注意:如果if 用[[ ]] 双引号的情况下,可以使用&& || 等运算符否则使用以上运算符**
**判断代码案例:**
```
usename="liudehua"
if [ $usename == "liudehua" ]
then
echo "hello word"
fi
```
![](https://img.kancloud.cn/7b/00/7b00346be8cb71f0d98505a4e44c47a1_736x232.png)
![](https://img.kancloud.cn/e6/5e/e65e6ab2fd232fbaa432cc5327e9ce9f_1372x780.png)
## **多条件判断代码案例:**
```
#!/bin/bash
usename=$1 #外部传值
if [ $usename -lt 60 ] # -lt是小于
then
echo "不及格"
elif [ $usename -gt 60 -a $usename -lt 80 ] #-gt大于 -a 是并且相当于&&
# elif相当于elseif
then
echo '良好'
else
# then相当于{}
echo "优秀"
fi #fi相当于闭合if
```
# **判断目录或者文件是否存在**
```
-e //判断目录或者文件是否存在
```
```
-d //判断目录是否存在
```
```
-f //判断文件是否存在
```
**
输入文件是否存在不存在就创建代码案例:**
```
[[ -e $1]] || mkdir $1 //
输入文件是否存在不存在就创建
```
# 运算符
```
`expr $a + $b`
// 单独的运算符是计算不了的 要加 反引号`` expr + (+左右要有空格)
```
## 代码案例:
![](https://img.kancloud.cn/9f/03/9f034bfce481f87e1930249de5c08c0c_508x366.png)
![](https://img.kancloud.cn/b9/22/b9221cce0cd052682155b10ce577d15a_508x345.png)
# 循环
```
语法:
for i in
do
done
```
```
for i in 1 2 3 4 5
do
echo $i
done
```
## 第二种for循环语法:
```
for i in {0..10}
do
echo $i
done
```
# while 循环语法:
一直循环下去
```
while true
//条件为true 相当于 while(1)
do
echo 'jjjj'
//一直循环下去 打印jjj
done
```
## 第二种while语法:
运行.sh脚本后 ,read 变量 接收终端输入的字符串
```
while read name //read name 是接收输入的字符串 在终端输入的字符串
do
echo $name
done
```
注意::ctrl+c 退出.sh脚本
# case流程语法
```
变量
case 变量 in
A值)
如果等于A值执行
;; //结束一条语句
esac
//结束语法
```
代码应用:
```
action=$1
//接收输入的值
case $action in
//case语法
start)
//如果值等于start输出这个的值
echo 'start'
;;
stop)
//如果值等于stop输出这个的值
echo 'stop'
;;
restart)
//如果值等于restart输出这个的值
echo 'restart'
;;
default)
//如果值等于default输出这个的值
echo 'star|stop|restart'
;;
esac
```
执行.sh脚本
![](https://img.kancloud.cn/1c/6f/1c6ff47def9a7c0e168b68e4115ac330_582x101.png)
# 函数定义与使用
```
第一种定义方法:
function 函数名称(){
}
第二种定义方法:
函数名称(){
}
```
## 函数调用:
在函数定义之后调用,不能在函数定义之前调用
```
函数名 //调用
```
函数语法解释:
```
#!/bin/bash
function xiao(){
echo "第一个函数"
}
xiao # //调用函数
```
## 函数传参数调用:
```
#!/bin/bash
function xiao(){
echo `expr $1 + $2`
//$1 $2接受参数
}
xiao 100 200 # //传递参数
```
# 文件引入:
```
. /全路径 /全路径/.sh //. 后面带空格
```
第二种引入方法
```
source /全路径/.sh
```
## 文件引入代码语法:
```
#!/bin/bash
. /root/test.sh
```
# 输出带颜色字体: