1. 简介
- 一般在shell 脚本的起始, 需要指定解释器的路径
#! /bin/bash
- 使用 # 作为注释标记符
- shell 脚本如果需要执行, 必须添加 执行(x) 权限, 一般可以
chmod a + x xxx.sh
- shell 的设置文件
- ~/.bashrc
- ~/.bash_profile
- ~/.bash_history
2. 终端打印
- 双引号中的特殊字符需要使用 转义符 显示的进行转义, 而单引号中不用
- echo 默认会在输出之后添加换行符, 而 printf 不会
- printf 用法与 C 语言, python 中非常类似
- echo 中 使用 -e 显示激活转义效果, 使用 -n 忽略结尾的 换行符
- 彩色输出:
- 格式:
echo -e "\e[1; Nm xxxx \e[0m"
- N 的取值范围: 30 ~ 37 前景色, 40 ~47 背景色
- 格式:
3. 玩转变量和环境变量
- 查看进程运行时变量:
- cat /proc/$PID/environ; (其中, PID 为进程id)
- 可以使用 pgrep 查看进程 的 id
- 使用 这个方式得到的环境变量可读性不好, 改用下面的指令, 将’\0’ 改为换行分割
cat /proc/$PID/environ | tr '\0' '\n'
- 变量操作:
- 赋值:
var=value
, ps: 等号两侧不能有空格 - 引用变量:
${var}, $var
- 赋值:
- 设置环境变量
export xxx
, 从当前shell 脚本执行的任何应用程序都会继承这个变量
- 获取字符串长度,
${#var}
- 识别当前shell,
$SHELL, $0
- 检测用户是否为超级用户:
$UID
- 修改bash 命令提示符 :
PS1="xxx"
- centos 7 中关于 PS1 的默认配置在 /etc/bashrc 中, 环境配置在 /etc/profile 中
4. 使用函数添加环境变量
- PATH 用于检索可执行文件, LD_LIBRARY_PATH 用来搜索库文件
- eval, 会对参数多处理一次, 先对变量进行变量的替换, 然后在对替换后的语句执行一个shell 操作
- 使用方法:
#先在.bashrc- 中加入函数
prepend() {[-d "$2"] && eval $1=\"$2\$\{$1:+':'\$$1\}\" && export $1; }
# 调用形式:
prepend PATH /opt/myapp/bin
prepend LD_LIBRARY_PATH /opt/myapp/lib
其中, ${parameter:+expression}
表示: 如果parameter 有值 且不为空, 就使用 expression 的值
5. 使用shell 进行数学运算
- 主要使用
let, (()), []
执行基本的算术操作, 使用expr, bc
执行高级操作 - expr 只能用于整数运算, 而 bc 支持浮点数(支持设定小数精度, 进制转换etc)
6. 玩转文件描述符及重定向
- 文件描述符是与文件输入, 输出相关联的整数, (stdin : 0, stdout: 1, stderr:2)
- 显示退出状态:
echo $?
- 为了保证屏幕上没有不必要信息, 可以使用重定向, 比如将错误信息重定向到 /dev/null 中
- 使用 tee 可以将数据重定向到文件, 同时又可以提供一份重定向数据的副本作为后续指令的stdin
- tee 默认会覆盖文件内容, 使用 -a 参数可以追加内容
- 文本中的文本块的重定向:
#! /bin/bash
cat << EOF > log.txt
xxx
EOF
通过指定 EOF 为结尾标志, 将从cat << EOF 开始, 到 EOF 结束的文本, 重定向到 log.txt 中 - 可以使用 exec 自定义文件描述符 (先声明, 在引用 &n)
7. 数组和关联数组
- 默认数组下标从 0 开始
- 打印数组所有值
echo ${array[*]}; echo ${array[@]}
- 打印数组长度:
echo ${#array[*]}
- 关联数组
- 首先声明一个数组:
declare -A array
, 然后赋值, 引用(类似 C++ 中的 map)
- 首先声明一个数组:
8. 使用别名
- 使用 alias 定义别名
- 使用 转义
\command
, 来忽略别名设置
9. 获取终端信息
- 使用 tput 和 stty 两款中断处理工具
10. 获取,设置日期和延时
- 使用指令 date, 根据不同参数, 可以获取不同的日期格式
- 延时 使用
sleep n
11. 调试脚本
- bash 支持调试,
bash -x xxx.sh
- 可以通过修改
#! /bin/bash -xv
达到启动调试的目的 - 下面这段代码蛮喜欢的:
12. 函数和参数
$n # 第 n 个参数
$@ # 被扩展成 $1 $2 $3
$* # 变成一个字符串
$? # 得到命令的返回值
13. 将命令序列的输出读入变量
- 使用管道并利用子shell 的方式将多个文件连接起来
- 获取 子shell 的输出:
cmd_output = $(ls | cat -n)
cmd_output = `ls | cat -n`
14. 不使用回车键读取n 个字符
- 主要使用 read
15. 运行命令直至执行成功
- 定义函数 repeat() 加入延时的版本
repeat() {while :; do $@ && return; sleep 30; done}
16. 字符分隔符和迭代器
- 通过设置 IFS 可以指定 字符分割符
- 迭代器: for 循环, while, until(类似 do while)
17. 比较和测试
- if 判断, 以 fi 结尾
- 算术比较 []:
- -gt, -lt, -ge, -le
- 文件系统测试相关 []:
-f, -x, -d, -e, -c, -b, -w, -r, -L - 字符串比较 [[]]
- 使用test 可以用来表示执行条件检测, 优势在于可以避免使用过多的括号