Sheer 编程
1. 概念
- Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。
- 同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;
- 作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支
1.1 简述
- shell是什么:解析执行用户的命令 命令解析器 ,让命令具有流程控制能力
- 支持交互式(interactive 逐句执行)
- 支持批处理(batch 写一个shell脚本 shell顺序执行)
- 与编程类语言相识 有变量和流程控制 但是解释性语言
1.2 sheel 的版本
- UNIX系统上有多种shell
- sh(bourne shell) 由 steve bourne开发 nuix内置
- csh(c shell) 由bill joy开发 shell升级版 支持作业控制 命令历史 命令行编译
- ksh(korn shell) 由david korn开发 sh+csh
- tcsh(tenex c shell) 是csh升级版 有命令补全功能
- bash(bourne again shell) sh的扩展
查看当前 sheel版本
echo $SHEEL
/bin/bash
2. 创建并执行一个 sheel文件
2.1 感受批量处理
[root@nt 桌面]# (date;ll;echo 1+1) # 命令之间用;分割
2021年 12月 20日 星期一 19:25:02 CST
总用量 68
-rwxr--r--. 1 root root 174 12月 18 12:15 1.sh
-rw-r--r--. 1 root root 740 12月 20 14:42 array1.sh
-rw-r--r--. 1 root root 117 12月 20 17:10 array2.sh
-rw-r--r--. 1 root root 362 12月 18 15:00 case1.sh
-rw-r--r--. 1 root root 295 12月 20 10:56 case2.sh
-rw-r--r--. 1 root root 123 12月 18 15:17 for1.sh
-rw-r--r--. 1 root root 412 12月 18 15:21 for2.sh
-rw-r--r--. 1 root root 208 12月 18 15:32 for3.sh
-rw-r--r--. 1 root root 936 12月 20 11:15 for4.sh
-rw-r--r--. 1 root root 619 12月 20 11:37 for5九九乘法表.sh
-rw-r--r--. 1 root root 940 12月 20 14:24 for6.sh
-rw-r--r--. 1 root root 351 12月 20 14:21 for7.sh
-rw-r--r--. 1 root root 1047 12月 20 16:57 function1.sh
-rw-r--r--. 1 root root 116 12月 18 14:06 if1.sh
-rw-r--r--. 1 root root 197 12月 18 14:42 if2.sh
-rw-r--r--. 1 root root 410 12月 20 10:58 if3.sh
-rw-r--r--. 1 root root 482 12月 20 14:30 while1.sh
1+1
2.2 定义变量
- 给变量赋值,等号前后不能有空格。
- $变量名,获取变量值
[root@nt 桌面]# i=1;echo $i; # 给变量赋值 等号前后不能有空格 #$变量名:获取变量值
1
2.3 创建 sheel文件
[root@]# touch 1.sh #创建空文件
[root@]# vim 1.sh #编辑文件
[root@]# ll #查看文件列表
总用量 8
-rw-r--r--. 1 root root 43 12月 18 09:31 1.sh
-rw-------. 1 root root 1232 12月 17 10:24 anaconda-ks.cfg
[root@]# cat 1.sh # 查看文件内容
# /bin/bash
date;
i=1;
echo $i;
ls -l;
[root@]# chmod u+x 1.sh #授予当前用户对1.sh的执行权
[root@]# ll
总用量 8
-rwxr--r--. 1 root root 43 12月 18 09:31 1.sh
-rw-------. 1 root root 1232 12月 17 10:24 anaconda-ks.cfg
```
### 2.4 执行 sheel文件
- 方式一:./sheel文件
- 方式二:shource sheel文件
- 方式三:/bin/bash sheel文件
- 方式四:sh sheel文件
```sheel
[root@]# ./1.sh
2021年 12月 18日 星期六 09:34:12 CST
1
总用量 8
-rwxr--r--. 1 root root 39 12月 18 09:34 1.sh
-rw-------. 1 root root 1232 12月 17 10:24 anaconda-ks.cfg
[root@]# source 1.sh
2021年 12月 18日 星期六 09:34:39 CST
1
总用量 8
-rwxr--r--. 1 root root 39 12月 18 09:34 1.sh
-rw-------. 1 root root 1232 12月 17 10:24 anaconda-ks.cfg
[root@]# /bin/bash 1.sh
2021年 12月 18日 星期六 09:34:50 CST
1
总用量 8
-rwxr--r--. 1 root root 39 12月 18 09:34 1.sh
-rw-------. 1 root root 1232 12月 17 10:24 anaconda-ks.cfg
```
## 3. window 与 Linux实现文件互传
### 3.1 通过 rzmingl
- 安装 rz
- <font color=red>yum install lrzsz</font>
### 通过 xftp文件
## 4. shell编程
### 4.1 数据类型
- 字符串类型:双引号、单引号
- 整数:注意 boolean用0和1表示
- 浮点数
### 4.2 语法
- 以分号表示语句结束 换行也可以表示语句结束
- 变量命名:由数字 字母 下划线组成,不能以数字开头 ,不能是shell关键字,区分大小写
### 4.3 变量
- 给变量赋值
```sheel
[root@java37master ~]# i=1; #等号两边不能有空格
[root@java37master ~]# i= 1
-bash: 1: 未找到命令
[root@java37master ~]# i =1
-bash: i: 未找到命令
```
- 输出变量
```sheel
[root@java37master ~]# echo $i; #输出变量i的值 并换行
1
[root@java37master ~]# printf $i; #输出变量i的值 但不换行
1[root@java37master ~]#
```
- $使用
```sheel
1[root@java37master ~]# i=1;j=$i;echo $j; #$i :获取变量i的值
1
[root@java37master ~]# j=${i};echo $j; #${i} :获取变量i的值
1
[root@java37master ~]# j=$((i+1));echo $j; #$((式子)) :进行数学运算
2
[root@java37master ~]# j=$[i+1];echo $j; #$[式子] :进行数学运算
2
[root@java37master ~]# j=$(date);echo $j; #$(命令) :执行语句 并获取结果
2021年 12月 18日 星期六 09:59:11 CST
```
- 通过键盘给变量赋值:read 函数
```sheel
[root@java37master ~]# read -p "请输入一个整数:" i;
请输入一个整数:3
[root@java37master ~]# echo $i;
3
```
### 4.4 运算
```sheel
[root@java37master ~]# i=2;
[root@java37master ~]# j=$((1+i));echo $j; #通过$((式子))
3
[root@java37master ~]# j=$[1+i];echo $j; #通过$[式子]
3
[root@java37master ~]# j=$(expr 1+1); echo $j; #获取的是字符串
1+1
[root@java37master ~]# j=$(expr 1 + 1); echo $j; #有空格 才进行运算
2
[root@java37master ~]# j=$(expr 1 + i); echo $j; #必须是常量值
expr: 非整数参数
[root@java37master ~]# j=$(expr 1 + $i); echo $j; #$i获取的就是值了
3
[root@java37master ~]# j=`expr 1 + $i`; echo $j; #列表必须是破折号 在1旁边
3
[root@java37master ~]# j=$(expr 3 \* 2 ); echo $j; #乘法运算
6
[root@java37master ~]# j=$(expr 3 / 2 ); echo $j; #除法运算
1
[root@java37master ~]# j=$(expr 3 % 2 ); echo $j; #求余运算
1
```
### 4.5 运算符
**数字运算符**
- -eq 等于
- -ne 不等于
- -gt 大于
- -ge 大于等于
- -lt 小于
- -le 小于等于
**字符串运算符**
- = 判断是否相等
- != 判断是否不同
- -n 是否为空
**逻辑运算符**
- ! 取反
- -a 与
- o 或