shell脚本编程
shell解析器:sh csh ksh bash
shell ------ 命令解析器
shell脚本 -----> shell命令的有序集合
把shell命令按一定的逻辑集合到一起,写入一个.sh的文件,去实现一个或多个功能,脚本文件不需要编译,可以直接执行
编译型:C C++ Java
解释型:脚本 python
写一个shell脚本文件的步骤:
- 创建一个.sh文件
touch test.sh
- 编辑脚本内容

- 执行脚本文件
1)chmod 777 test.sh
./test.sh
2)bash test.sh
shell变量
shell中可以建立变量存储数据,但是不支持数据类型,所有赋值给变量的值都解释为一串字符
格式:
变量名=值
注意:=左右两边都不能有空格
取变量的值:$变量名
自定义变量
变量名=值`
`变量名='值'`
`变量名="值"`
`' '内不支持$展开变量的值`
`

位置变量 和命令行参数
$0 - --> 执行脚本文件
1 2 3 ... 9
${n} ------ n 大于或等于10的数
$# ------ 获取所有的外部参数的个数(不包括脚本文件名)
\* 或 @ ------ 获取所有的外部参数(不包括脚本文件名)

预定义变量
$? 获取上一条命令是否是正确的执行结果
0为真 非0为假
$$ 获取当前脚本的进程ID

shell语句
1)说明性语句
以#开头到该行结束,不被解释执行
2)功能性语句
任意shell命令
3)结构性语句
条件测试语句、分支语句、循环语句、循环控制语句
功能性语句
read(类似c语言的scanf)
从终端获取值赋值给变量
格式:
read 变量名1 变量名2 ....
按顺序赋值,把剩下的所有内容赋值给最后一个变量

read -p "提示语" 变量名 ...

expr
算术运算命令,主要用来进行简单的整数运算,如:+ - * / %

注意:
运算符左右两侧有空格
*和()需要加转义字符
expr可以直接输出运算结果,如果后期需要使用该结果,可以结合shell变量
let
运算中不能有空格
运算结果需要赋值给一个变量
变量在参与运算的过程中,不用加$取值

结构性语句
test语句
可以测试三种对象:
字符串、整数、文件属性
字符串的测试:
s1 = s2` `测试两个字符串的内容是否一样`
`test "hello" = "hello"`
`echo $?` `# 0`
`s1 != s2` `测试两个字符串的内容是否不一样`
`test "hlo" != "hello"`
`echo $?` `# 0`
`-z s1` `测试字符串长度是否为0`
`test -z ""`
`echo $?` `# 0`
`-n s1` `测试字符串长度是否不为0
整数的测试
a -eq b 相等
a -ne b 不相等
a -gt b 大于
a -ge b 大于等于
a -lt b 小于
a -le b 小于等于

文件属性测试
-d name` `测试name是否是一个目录`
`test -d ~/25081`
`echo $?`
`-f name` `测试name是否是一个普通文件`
`test -f ~/25081/918/test.sh`
`echo $?`
`-e name` `测试name文件是否存在`
`test -e ~/25081/918`
`echo $?`
`
分支语句
if语句
基本结构
if 表达式`
`then`
`命令表`
`fi

if 表达式`
`then`
` 命令表1`
`else`
`命令表2`
`fi`
`

使用 把test省略, 表示一个test指令

分层结构
if` ` 表达式1`
`then`
`命令表1`
`elif` ` 表达式2`
`then`
`命令表2`
`else`
`命令表3`
`fi

嵌套结构
if` ` 表达式1`
`then`
`if` `表达式2`
`then`
`命令表`
`fi`
`fi
90---100 A
\[ $num -ge 90 \&\& $num -le 100 \]
已知学生成绩(100分为满分)与等级的对应关系为:
|------------------|----|
| 成绩(grade) | 等级 |
| 90<=grade<=100 | A |
| 80<=grade<90 | B |
| 70<=grade<80 | C |
| 60<=grade<70 | D |
| grade<60 | E |
请你编写一个程序,要求:输入学生成绩,输出学生成绩对应的等级

判断文件
先判断是否存在
存在---》文件夹 文件

case语句
case 变量 in`
`模式1)`
`命令表1`
`;;`
`模式2)`
`命令表2`
`;;`
`*)`
`命令表n`
`;;`
`esac

循环语句
for ...do...done
for` ` 变量名 in` ` 单词表`
`do`
`命令表`
`done
for循环的几种书写格式:
for i in 1 2 a b c`
`do`
` echo "$i"`
`done
for i in {1..10}`
`do`
` echo "$i"`
`done`
`
变量i从命令行取值,可以省略in 单词表
for i`
`do`
` echo "$i"`
`done
for ((i=0;i<5;i++))`
`do`
` echo "$i"`
`done`
`
实现1-10的数字和


while...do...done
#!/bin/bash`
`i=1`
`while [ $i -lt 5 ]`
`do`
` echo $i`
` ((i++))`
`done