获取脚本运行目录
CURRENT_DIR=$(
cd $(dirname $0)
pwd
)
或者
CURRENT_DIR="$(dirname $0)"
解析:
dirname
命令接受一个文件路径作为参数,返回该路径对应的目录路径。例如我们执行:
dirname /path/to/my.c
返回的结果为:
/path/to
还有一个命令为basename
。接受参数一样,但是返回路径中对应的文件名。例如执行:
basename /path/to/my.c
返回的结果为:
my.c
检测某个命令是否存在
command_exists() {
type $1 >/dev/null
}
解析:
type
命令的作用为显示命令的类型。默认不加参数的输出为人类可读的英文句子。
可以使用-t
参数,只输出命令的类型,使用一个单词来表示。
命令的类型有如下几种:
- alias:别名
- keyword:关键字
- function:函数
- builtin:内建命令
- file:文件或外部命令
- unfound:未找到
检测某个进程是否在运行
if kill -0 $pid >/dev/null 2>&1;then
# ...
else
# ...
fi
解析:
kill
命令用于向进程发送信号(SIGNAL),常用于终止进程运行(优雅停止和暴力停止)。
0这个信号比较特殊,查看kill
命令的帮助文档解释如下:
If sig is 0, then no signal is sent, but error checking is still performed; this
can be used to check for the existence of a process ID or process group ID.
0意味着不发送任何信号,但是仍会进行错误检查。可用于检查PID对应的进程是否在运行。
后台启动程序并返回进程号
run_process_background() {
nohup $1 >/dev/null 2>&1 &
pid=$!
}
将shell用到的方法抽取到独立文件
例如我们将脚本包含的方法抽取到functions.sh
,可以这么操作:
functions.sh
文件:
demo() {
echo 'Invoke some function'
}
main.sh
中需要使用functions.sh
中demo
方法,我们可以这么写:
. ./functions.sh
demo
解析:
.
(点)命令和source
命令相同,在同一个shell中执行脚本。当然,被调用脚本的变量等信息会反应到当前shell中。和C语言的#include
或者PHP的require
作用类似。
打印彩色文字
echo -e "\033[32m 绿色 \033[0m"
其中\033[32m
代表它之后的文本以绿色显示。\033[0m
表示它之后的文本显示效果恢复默认。
总结一下,表示颜色的代码格式为:\033[xm
,其中x为特效代码。
相关特效代码整理如下:
编码 颜色/动作
0 重新设置属性到缺省设置
1 设置粗体
2 设置一半亮度(模拟彩色显示器的颜色)
4 设置下划线(模拟彩色显示器的颜色)
5 设置闪烁
7 设置反向图象
22 设置一般密度
24 关闭下划线
25 关闭闪烁
27 关闭反向图象
30 设置黑色前景
31 设置红色前景
32 设置绿色前景
33 设置棕色前景
34 设置蓝色前景
35 设置紫色前景
36 设置青色前景
37 设置白色前景
38 在缺省的前景颜色上设置下划线
39 在缺省的前景颜色上关闭下划线
40 设置黑色背景
41 设置红色背景
42 设置绿色背景
43 设置棕色背景
44 设置蓝色背景
45 设置紫色背景
46 设置青色背景
47 设置白色背景
49 设置缺省黑色背景
颜色代码整理来源:shell脚本输出带颜色字体
打印旋转线
可用作执行持续时间较久的任务时候打印一个持续“旋转”的直线。代码如下:
spin() {
local i=0
local sp='/-\|'
local n=${#sp}
printf ' '
sleep 0.1
while true; do
printf '[%s]\b\b\b' "${sp:i++%n:1}"
sleep 0.1
done
}
解析:
while循环中的${sp:i++%n:1}
表示每次打印sp
字符串中的一个字符,打印完最后一个就从头开始(对i++取模运算,n为字符串sp的长度)。printf
指令后的\b
表示退格(backspace)。每次打印完旋转线后退3个字符,下次while循环的时候就会覆盖掉之前的字符,从而实现“旋转”的效果。
一个例子:我们编写一个脚本progress.sh
,实现后台执行耗时较长命令,同时显示旋转线作为提示,命令执行完毕后打印绿色的Success字样。
progress.sh
命令运行的格式为:
./progress.sh "命令" "提示语"
比如我们这么使用:
./progress.sh "sh workload.sh" Downloading:
workload.sh
是一个耗时较长的命令,我们用sleep来模拟:
#!/bin/bash
echo 'Working'
sleep 3
echo 'Finished'
该命令执行后会显示
Downloading: [\]
旋转线提示符。workerload.sh
执行完返回后会显示:
Downloading: [Success]
其中Success为绿色显示。
下面放出代码:
#!/bin/bash
run_process_background() {
nohup $1 >/dev/null 2>&1 &
pid=$!
}
spin() {
local hint=$1
local i=0
local sp='/-\|'
local n=${#sp}
sleep 0.1
printf '%s' "${hint} "
while kill -0 $pid >/dev/null 2>&1; do
printf '[%s]\b\b\b' "${sp:i++%n:1}"
sleep 0.1
done
printf '[\033[32m%s\033[0m]' "Success"
}
run_process_background "$1"
spin "$2"