shell脚本技巧整理

全局错误控制

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

: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

欢迎补充指正!

发布了231 篇原创文章 · 获赞 77 · 访问量 52万+

猜你喜欢

转载自blog.csdn.net/butterfly5211314/article/details/90924411