linux全套 | Shell编程 | 16
Shell bash
首先shell
是什么?
- 解释器,启动器
-解释器:
解释器有两种解释的方式
1) 用户交互输入: 就是用户输入一行,机器执行一行
2) 文本文件输入: 就是把要执行的 shell 命令写在一个文件中,然后执行
source 脚本文件
. 脚本文件
如何在文件中定义脚本解释器?
- #!/bin/bash
- #!/usr/bin/python
在 脚本文件 中第一行写上面的语句,就是交代了该脚本文件使用什么解释器执行
否则就需要手动写
source/. 脚本文件
python 脚本文件
注意: 在此之前需要给文件加上可执行权限 chmod +x 脚本文件
shell中也可以定义函数,下面是shell中定义函数的一个简单样式
文本流 & 重定向
重定向
默认是标准的输入输出,现在自己手动指定输入输出的文件
>,>>,>& 重定向输出(1>,2>)
<,<<,<<<重定向输入
1>,1>>: 标准输出重定向
2>,2>>: 错误输出重定向
0<,0<<,0<<<: 标准输出重定向
>/< 完全重写
>>/<< 追加
程序自身都有I/O
0: 标准输入
1: 标准输出
2: 错误输出
&>,>&
将标准输出和错误输出都重定向到一个文件中
ls -l /god /usr >& ls.out
输出重定向使用
输入重定向使用
变量
shell的变量的作用域如下
- 本地
- 局部
- 位置
- 特殊
- 环境
本地变量
当前shell拥有(其他shell无法使用),生命周期随shell(重启shell后会消失 )
name=god
echo $name
局部变量
只能local用于函数
函数(){
...
local val=100
...
}
位置变量
- $1,$2,${11}
传递的第n个参数
- $#: 位置参数个数
- $*/$@: 参数列表
特殊变量
- $$: 当前shell的pid
- $?: 上一个命令退出的状态
0:成功
other: 失败
环境变量
export 变量名
source 脚本文件
下面是配置python环境变量的例子
cd /etc/profile.d 进入全局环境变量的脚本目录
vim python3.sh 编写环境变量的脚本
=====python3.sh=====
export PYTHON_HOME=/opt/python3.7
export PATH=${PYTHON_HOME}/bin:$PATH
====================
source /etc/profile 更新全局的配置脚本
引用 & 命令替换
引用
单引号' : 弱引用,不会解析变量(不能进行转义)
双引号" : 强引用,会解析变量
注意: 引用输出后会删除引号
命令替换
`` 或 $()
`ls -l /`
$(ls -l /)
注意: 命令替换是可以进行扩展的 $($()....)
退出状态 & 逻辑判断
退出状态
echo $?
- 0 成功退出
- other 退出失败
逻辑判断
- command1 && command2
- command1 || command2
表达式
算术表达式
(1)
a=10
b=20
let c=$a+$b
(2)
$(())
c=$((a+b))
条件表达式
test,[]
- [表达式]
- test 表达式
可以使用 help test 来查看帮助
练习题
- 添加用户
- 用户密码同用户名
- 静默运行脚本
- 避免捕获用户接口
- 程序自定义输出
流程控制
- if
if ...;
then ...;
elif ...;
else ...;
fi
经典格式: if [ 表达式 ] ; then 表达式 ; else 表达式 ; fi
if [3 -gt 8] ; then echo "ok" ; else echo "not ok" ;
- while
while 条件表达式;
do
...
done
- for
步进for: for (( i=1;i<10;i++ )); do echo $i ; done
增强for: for i in "bj sxt" "sh sxt" "gz sxt"; do echo $i; done
for (());do
...
done
for i in ...;do
...
done
- case
练习题
- 用户给定路径
- 输出文件大小最大的文件
- 递归子目录
练习题
循环按行输入文件内容(要求多种方式)