全局错误控制
ref: http://www.ruanyifeng.com/blog/2017/11/bash-set.html
- set -u脚本在头部加上它,遇到不存在的变量就会报错,并停止执行。
- set -x用来在运行结果之前,先输出执行的那一行命令。
- set -e使得脚本只要发生错误,就终止执行。
- set -o pipefail 只要一个子命令失败,整个管道命令就失败,脚本就会终止执行
实用小技巧
- local关键字生成局部变量
function f() {
local i=1
}
f()
echo $i // nil
ref: http://ju.outofmemory.cn/entry/358546
- 检查一个命令有没有安装
command ls >/dev/null 2>&1
# 0
echo $?
command xxxxxx >/dev/null 2>&1
# 非0
echo $?
# 可以封装成一个函数
function isCmdExist() {
local cmd="$1"
if [ -z "$cmd" ]; then
echo "Usage isCmdExist yourCmd"
return 1
fi
command "$cmd" >/dev/null 2>&1
if [ $? -eq 0 ]; then
return 0
fi
return 2
}
# 调用
if ! isCmdExist docker; then
echo "install docker please"
fi
- 获取脚本所在目录
$(dirname $0)
# 惯用写法
# 加上cd,pwd可以获取到绝对路径
scriptDir=$(cd `dirname $0`; pwd)
- 指定循环多少次(测试用)
# 循环100次
for i in `seq 100`; do
echo $i
done
或者用{1..100}这种形式也可以(生成多个测试文件/目录, touch/mkdir)
- 自己执行清理工作(优雅退出)
下面的代码, 保存为trap.sh, 执行bash trap.sh
, 会执行两次graceStop, 如果没有EXIT, 则执行一次(EXIT是在正常退出时可以捕获到)
#!/bin/bash
function graceStop() {
echo "more works..."
echo "The End"
}
trap "graceStop" SIGINT SIGTERM EXIT
sleep 1000s
实例: https://blog.csdn.net/butterfly5211314/article/details/54645288
-
字符串转数组
https://blog.csdn.net/butterfly5211314/article/details/83095084 -
在 Vim 中无需权限保存编辑的文件。(现场实验)
ref: https://www.jb51.net/LINUXjishu/608817.html
:w !sudo tee %
- 快速复制文件
cp filename{,.bak}
- 在编写SHELL 时显示多行信息
cat << EOF
+--------------------------------------------------------------+
| === Welcome to My Home === |
+--------------------------------------------------------------+
EOF
# 输出禁止转义, $abc会原样输出,
# 如果是 cat << EOF, $abc会输出为123
abc=123
cat << \EOF
$abc
EOF
欢迎补充指正!