Shell编程入门
- 一、Shell概述
- 1.1 Shell的作用
- 1.2 Linux提供的Shell解释器
- 1.3 Centos默认的解析器是bash
- 二、Shell脚本入门案例
- 三、变量
- 3.1 系统变量
- 3.2 自定义变量
- 3.3 特殊变量
- 四、运算符
- 五、条件判断
- 5.1 基本语法
- 5.2 常用判断条件
- 5.3 多条件判断
- 六、流程控制
- 6.1 if语句
- 6.2 case语句
- 6.3 for循环
- 6.4 while循环
- 七、read读取控制台输入
- 八、函数
- 8.1 系统函数
- 8.2 自定义函数
- 九、正则表达式入门
- 9.1 是什么
- 9.1 常规匹配
- 9.2 常用特殊字符
一、Shell概述
1.1 Shell的作用
- Shell是一个基于Linux内核和应用程序之间的一个命令行解释器 它接收应用程序/用户命令 然后调用操作系统内核 由操作系统指挥硬件完成工作
- Shell还是一个功能相当强大的编程语言(脚本语言),易编写、易调试、灵活性强。
- Shell属于解释型语言(C、C++是编译型语言;Python、JavaScript、Matlab是解释型语言;Java、C#兼具编译与解释两种特性。)
1.计算机硬件 人类肯定是无法直接和它交流的
2.这个时候 就需要各种操作系统对硬件进行封装(Linux/Windows)
通过操作系统 去调用硬件来工作
3.最外层的应用程序 类似于QQ/微信等 才是我们人类操作计算机喜欢的方式
但是我们打开操作这些应用程序 或者说输入ls cd这些命令
操作系统是怎么认识这些命令然后让硬件去执行的呢?
4.Linux操作系统只认识二进制编码 然后通过二进制编码和硬件交互
所以这个时候Shell的作用就来了
Shell可以看做一个翻译官(命令行解析器)
Shell拿到外部应用程序的指令 会把指令解析成二进制编码
操作系统能看懂这些二进制编码 然后就会去调用硬件来完成相应工作
1.2 Linux提供的Shell解释器
说明Shell解析器本质上也是个命令
命令在Linux中 也就是一个封装好的文件
1.3 Centos默认的解析器是bash
echo $SHELL
结果是:/bin/bash
二、Shell脚本入门案例
三、变量
3.1 系统变量
HOME、PWD、SHELL、USER等
3.2 自定义变量
- 基本语法
定义变量:变量=值
撤销变量:unset 变量
声明静态变量(类似常量):readonly变量 注意:不能unset
和Java一样 变量都是暂时加载在内存 重启就没了 - 变量定义规则
变量名称可以由字母、数字和下划线组成,但是不能以数字开头
环境变量名建议大写
等号两侧不能有空格 否则会被当成命令
在bash中 变量默认类型都是字符串类型 无法直接进行数值运算
变量的值如果有空格 需要使用双引号或单引号括起来
export可把变量提升为全局环境变量 可供其他Shell程序使用
3.3 特殊变量
$n
$#
$*
$@
$?
检测最后一次执行的命令的返回状态
如果这个变量的值为0,证明上一个命令正确执行
如果这个变量的值为非0(具体是哪个数 由命令自己来决定)则证明上一个命令执行不正确
四、运算符
$[运算式] 建议用这个
$((运算式))
五、条件判断
5.1 基本语法
- test condition
- [ condition ](注意condition前后要有空格) 常用这个
5.2 常用判断条件
== 字符串比较
-lt 小于(less than)
-le 小于等于(less equal)
-eq 等于(equal)
-gt 大于(greater than)
-ge 大于等于(greater equal)
-ne 不等于(Not equal)
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence)
-d 文件存在并是一个目录(directory)
下面是一些案例
5.3 多条件判断
规则和Java一样
六、流程控制
6.1 if语句
这里赋权限是为什么 前面二、案列说过了
- [ 条件判断式 ] 中括号和条件判断式之间必须有空格
- if后要有空格
6.2 case语句
- case行尾必须为单词“in” 每一个模式匹配必须以右括号 )结束
- 双分号 ;; 表示命令序列结束 相当于java中的break
- 最后的 *) 表示默认模式 相当于java中的default
6.3 for循环
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
for 变量 in 值1 值2 值3…
do
程序
done
6.4 while循环
while [ 条件判断式 ]
do
程序
done
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo $s
七、read读取控制台输入
- 基本语法:read(选项)(变量名)
- 选项:
-p:指定读取值时的提示符
-t:指定读取值时等待的时间(秒) - 变量名:指定读取值的变量名
- 案例实操
提示7秒内 读取控制台输入的名称
#!/bin/bash
read -t 7 -p "Enter your name in 7 seconds " NAME
echo $NAME
八、函数
8.1 系统函数
basename:
- 基本语法:basename [string / pathname] [suffix]
- 功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符 然后将剩下的字符串显示出来
- suffix为后缀 如果suffix被指定了 basename会将pathname或string中的suffix去掉
- 案例
截取该/home/atguigu/banzhang.txt路径的文件名称
basename /home/atguigu/banzhang.txt
# 打印banzhang.txt
basename /home/atguigu/banzhang.txt .txt
# 打印banzhang(这里的.txt就是suffix)
dirname
dirname 文件绝对路径:
从给定的包含绝对路径的文件名中去除文件名(非目录的部分)
然后返回剩下的路径(目录的部分)
# 获取banzhang.txt文件的路径
dirname /home/atguigu/banzhang.txt
/home/atguigu
8.2 自定义函数
- 基本语法
#定义函数
[ function ] funname[()]
{
Action;
[return int;] #只能返回int类型
}
#调用函数
funname
#定义函数可以化简 把[]全都去掉:
function funname()
{
Action;
return int;
}
- 必须在调用函数地方之前 先声明函数 shell脚本是逐行运行 不会像其它语言一样先编译
- 函数返回值 只能通过$?系统变量获得
- 可以显示加return返回 如果不加 将以最后一条命令运行结果 作为返回值
- return后跟数值n(范围是0-255) 如果return 300 返回值是300%256=44
案例:
# 计算两个输入参数的和
# [atguigu@hadoop101 datas]$ touch fun.sh
# [atguigu@hadoop101 datas]$ vim fun.sh
#!/bin/bash
function sum()
{
s=0
s=$[ $1 + $2 ]
echo "$s"
}
read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;
[atguigu@hadoop101 datas]$ chmod 777 fun.sh
[atguigu@hadoop101 datas]$ ./fun.sh
Please input the number1: 2
Please input the number2: 5
7
如何改进结果是88的错误情况?
九、正则表达式入门
9.1 是什么
正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串
在很多文本编辑器里 正则表达式通常被用来检索、替换那些符合某个模式的文本
在Linux中 grep,sed,awk等命令都支持通过正则表达式进行模式匹配
9.1 常规匹配
一串不包含特殊字符的正则表达式匹配它自己 如:
cat /etc/passwd | grep at
就会匹配所有包含at的行
9.2 常用特殊字符
^$ 匹配出的内容就是空行
.*匹配的内容就是所有结果 0个或者多个的任意字符不就是所有内容
[a,b,c]*就表示匹配这三个字母出现0次或者多次