BASH基础
- shell为Linux提供了编程环境
- 程序=指令+数据
- 程序编程式风格
- 面向过程:以指令为中心,数据服务于命令
- 面向对象:以数据为中心,命令服务于数据
- shell是一种过程式编程
- 过程式编程
- 顺序执行
- 循环执行
- 选择执行
- shell脚本文件:文本文件#!/bin/bash
运行脚本
变量命名
- 命名只能使用英文字母,数字和下划线,首字母不能以数字开头
- 中间不能够有开头,可以使用下划线
- 不能使用标点符号
- 不能使用bash中的关键字
- 使用变量:$[变量名]
- 只读变量:readlonly [变量名]
- 删除变量:unset [变量名]
- 变量种类
- 本地变量:生效范围仅为当前shell进程
- 变量赋值:name=value
- 环境变量:生效范围为当前shell进程以及子进程
- 变量声明1:export name=”value”
- 变量声明2:declare -x name=”value”
- bash中有很多环境变量:SHELL、PATH等
- 局部变量:生效范围为当前shell进程中某代码片段(通常指函数)
- 位置变量:1、2…来表示,让脚本在脚本代码中调用通过命令行传递给它的参数
- $1, $2对应调用第一,第二个参数
- $0:命令本身
- $*:传递给脚本的所有参数
- $@:传递给脚本的所有参数
- $#:传递给脚本参数的给叔
- 特殊变量:? 0 * @ $#
- 本地变量:生效范围仅为当前shell进程
shell数组
bash配置文件
- 生效范围分类
- 全局配置:
- /etc/bashrc
- /etc.profile
- /etc/profile.d/*.sh
- 个人配置:
- ~/.bash_profile
- ~/.bashrc
- 功能:
- 用于定义环境变量
- 运行命令脚本
- 全局配置:
- 功能分类
- profile类:为交互式的shell提供配置
- bashrc类:为非交互式的shell提供配置
- 功能:定义变量别名、定义本地变量
- shell登录
- 交互式登录:su -USERNAME
- /etc/profile –> /etc/profile.d/*.sh –> ~/.bash_profile –> ~/.bashrc –> /etc/bashrc
- 非交互式登录:su USERAME
- ~/.bashrc –> /etc/bashrc –> /etc/profile.d/*.sh
- 编辑配置文件定义的新设置的生效方式
- 重新启动shell进程
- 使用source命令
- 交互式登录:su -USERNAME
- bash中算数运算符
- ‐ / % ** … 完成算数运算: (1) let var(变量名)=算术表达式 (2) var=$[算术表达式] (3) var=$((算术表达式)) (4) var=$(expr argl arg2 arg3 …) 乘法符号有些场景中需要转义 : \
- 生效范围分类
bash有内建随机数生成器:$RANDOM
增强赋值:
+=,‐=,*=,/=,%=
条件测试
- bash条件测试
- 判断某些需求是否满足,需要测试机制来实现
- 专用的测试表达式需要由命令辅助完成测试过程
- 测试类型
- 数值测试
- 字符串测试
- 文件测试
- 数值测试
- 是否大于:-gt
- 是否大于等于:-ge
- 是否等于:-eq
- 是否不等于:-ne
- 是否小于:-lt
- 是否小于等于:-le
- 字符串测试
- 是否等于:==
- 是否大于:>
- 是否小于:<
- 是否不等于:!=
- 左侧的字符串是否能够被右侧字符串匹配:=~
- 测试字符串是否为空,空则为镇,不空则为假:-z STRING
- 测试字符串是否为不空,不空则为真,空则为假
- 文件测试
- 简单的存在性测试
- -a:文件存在性测试,存在为真,否则为假
- 存在性及类型测试
- -b:是否存在且为快设备文件
- -c:是否存在且为字符设备文件
- -d:是否存在且为目录文件
- -f:是否存在且为普通文件
- -h或者-L:存在且为符号链接文件
- -p:是否存在且为命名管道文件
- -S:是否存在且为套接字文件
- 文件权限测试
- -r:是否存在且可读
- -w:是否存在且可写
- -x:是否存在且可执行
- 文件特殊权限测试
- -g:是否存在且拥有sgid权限
- -u:是否存在且拥有suid权限
- -k:是否存在且拥有sticky权限
- 文件大小测试
- -s:是否存在且非空
- 文件是否打开
- -fd:fd表示文件描述符是否已经打开且与某终端相关
- -N:文件自从上一次读取过后是否被修改过
- -O:当前用户是否为文件的属主
- -G:当前有效用户是否为文件数组
- 双目测试
- FILE1 ‐ef FILE2 :FILE1与FILE2是否指向同一个设备上的相同inode
- FILE1 ‐nt FILE2:FILE1是否新于FILE2
- FILE1 ‐ot FILE2:FILE1是否旧于FILE2、
- 简单的存在性测试
- 组合测试条件
逻辑运算符:
第一种方式:
COMMAND1 && COMMAND2COMMAND1 || COMMAND2! COMMAND第二种方式:
EXPRESSION1 ‐a EXPRESSION2 EXPRESSION1 ‐o EXPRESSION2 ! EXPRESSIONNote:必须使用测试命令进行
bash退出状态码
语法
if 判断条件;then
条件为真的分支代码
elif 判断条件;then
条件为真的分支代码
else
条件为假的分支代码
fi
用户交互
- read命令
常用选项:
‐a:将内容读入到数组中
echo ‐n “Input muliple values into an array:”
read ‐a array
echo “get ${#array[@]} values in array”
‐d : 表示delimiter,即定界符,例如输入为 hello m,有效值为“hello”,请注意m前面的空格等会被删除
‐e :只用于互相交互的脚本
‐n : 用于限定最多可以有多少字符可以作为有效读入
‐p :用于给出提示符,例如:echo –n “…“来给出提示符,可以使用read –p ‘… my promt?’value的方式只需
一个语句来表示
‐r :特殊字符生效(/n等),也应采用‐r选项。
‐s : 对于一些特殊的符号不打印的情况
‐t :用于表示等待输入的时间(s),等待时间超过,将继续执行后面的脚本
循环语句以及函数
for 循环
for 变量名 in 列表;do 循环体 donewhile循环
while 测试条件;do
循环体
done
经典使用:
#!/bin/bash
while read a;do
echo $a
done < /datas/6files
语法:
function FUNNAME(){
函数体
返回值
}
FUNNME #调用函数
