shell脚本技巧
使用环境变量$RANDOM
生成随机数
- 生成
0~32767
之间的随机数
jun@jun:tmp$ echo $RANDOM
13869
jun@jun:tmp$ echo $RANDOM
8449
- 生成
0~10
之间的随机数
jun@jun:tmp$ echo $(($RANDOM % 10))
0
jun@jun:tmp$ echo $(($RANDOM % 10))
2
jun@jun:tmp$ echo $(($RANDOM % 10))
7
- 生成
1~9
之间的随机数
jun@jun:tmp$ echo $(($RANDOM % 9 + 1))
2
jun@jun:tmp$ echo $(($RANDOM % 9 + 1))
8
jun@jun:tmp$ echo $(($RANDOM % 9 + 1))
3
使用mktemp
生成随机字符串
mktemp
本来是用来生成临时的目录或文件
# 生成目录
$ mktemp -d
/tmp/tmp.0d9G0ZExaj
# 生成指定格式命名的目录
jun@jun:tmp$ mktemp -d XXX
NB4
jun@jun:tmp$ mktemp -d test-XXX
test-x1Z
$ mktemp -d test.XXXX
test.HJlw
# 生成文件
$ mktemp
/tmp/tmp.Cr6JAVCSih
# 生成以指定格式命名的文件
$ mktemp XXX
yxb
$ mktemp hello-XXX
hello-89s
$ mktemp hello.XXX
hello.u0G
- 使用
mktemp -u
产生随机字符串
-u, --dry-run do not create anything; merely print a name (unsafe)
# 生成指定长度的随机字符串(最少3个字符)
$ mktemp -u XXX
Yyt
$ mktemp -u XXXX
JiFU
$ mktemp -u XXXXX
da1tB
$ mktemp -u test-XXXXX
test-yiSdJ
shell脚本退出时执行清理操作
- 通过
trap
命令实现,参考链接
https://cloud.tencent.com/developer/article/1398522
- 通过
trap
命令可以实现在通过ctrl+c
命令杀死正在执行的shell脚本时,先执行一些清理善后的操作,再退出脚本
#!/bin/bash
cleanup()
{
echo "do some cleanup job!"
exit 0
}
# ctrl+c退出脚本时,先执行cleanup,进行一些清理工作
trap cleanup EXIT
while true
do
echo "sleep 1s"
sleep 1
done
执行结果如下:
root@ubuntu:tmp# ./test.sh
sleep 1s
sleep 1s
sleep 1s
^Cdo some cleanup job!
- 需要注意的是:trap并不能处理所有的信号,尤其是
SIGKILL
和SIGSTOP
在man手册中有如下描述
Setting a trap for SIGKILL or SIGSTOP produces undefined results
timeout
控制程序运行的时间或发送信号
- 参考链接
https://cloud.tencent.com/developer/article/1589813
timeout
是用来控制程序运行的时间,运行指定的命令。如果在指定时间后仍在运行,则杀死该进程。使用timeout
命令可以让程序在指定的时间内仍然运行则强制退出timtout
可以用来定时发送信号给指定的进程
# 3s后结束ping操作
$ timeout 3 ping www.baidu.com
# 1min后结束ping操作
$ timeout 1m ping www.baidu.com
# 1hour后结束ping操作
$ timeout 1h ping www.baidu.com
# 1天后结束ping操作
$ timeout 1d ping www.baidu.com
# 0.1min(6s)后结束ping操作
$ timeout 0.1m ping www.baidu.com
# 5s后发送SIGKILL信号给ping命令
$ timeout -s SIGKILL 5s ping www.baidu.com
使用printf
实现进制转换
- 参考链接
https://blog.iderzheng.com/base-conversion-with-printf-in-bash/
- 十进制转十六进制
$ num_hex=$(printf "%x" 10)
$ echo $num_hex
a
$ num_hex=$(printf "%X" 10)
$ echo $num_hex
A
$ num_hex=$(printf "0X%X" 10)
$ echo $num_hex
0XA
- 十六进制转十进制
$ num_dec=$(printf "%d" 0xa)
$ echo $num_dec
10
$ num_dec=$(printf "%d" 0xA)
$ echo $num_dec
10
- 八进制转十进制
$ num_dec=$(printf "%d" 011)
$ echo $num_dec
9
- 十进制转八进制
$ num_oct=$(printf "%o" 9)
$ echo $num_oct
11
$ num_oct=$(printf "0%o" 9)
$ echo $num_oct
011
任意进制转换
- 参考链接
https://blog.csdn.net/liangjiu2009/article/details/46915333
- 十进制转其它进制
# 十进制转十六进制
$ echo 'obase=16;10' | bc
A
# 十进制转二进制
$ echo 'obase=2;10' | bc
1010
# 十进制转八进制
$ echo 'obase=8;10' | bc
12
# 甚至可以十进制转五进制
$ echo 'obase=5;10' | bc
20
- 十六进制转十进制
# 十六进制数A转十进制
$ echo $((16#A))
10
# 十六进制B转十进制
$ echo $((16#B))
11
- 八进制转十进制
# 八进制数071转十进制
$ echo $((8#071))
57
# 八进制数072转十进制
$ echo $((8#072))
58
- 二进制转十进制
# 二进制数1010转十进制
$ echo $((2#1010))
10
# 二进制数1011转十进制
$ echo $((2#1011))
11
- 二进制转十六进制(先转成十进制,再转成十六进制)
# 先转十进制,再转十六进制
# 二进制数1010转为十六进制
$ echo "obase=16;$((2#1010))" | bc
A
# 二进制数1011转为十六进制
$ echo "obase=16;$((2#1011))" | bc
B
- 二进制转八进制(先转成十进制,再转成八进制)
# 二进制1010转成八进制
$ echo "obase=8;$((2#1010))" | bc
12
# 二进制1011转成八进制
$ echo "obase=8;$((2#1011))" | bc
13
- 八进制转二进制(先转成十进制,再转成二进制)
# 八进制017转成二进制
$ echo "obase=2;$((8#017))" | bc
1111
# 八进制016转成二进制
$ echo "obase=2;$((8#016))" | bc
1110
- 八进制转十六进制(先转成十进制,再转成二进制)
# 八进制016转成十六进制
$ echo "obase=16;$((8#016))" | bc
E
# 八进制017转成十六进制
$ echo "obase=16;$((8#017))" | bc
F