背景介绍
最近一段时间在 openwrt下面使用shell进行脚本开发。开发完成后,进行整理归纳,方便后续回顾学习
shell 一些使用技巧
shell 基础知识
`` 和()(())
` cmd` (反引号) 和 $(cmd) 都表示执行 cmd指令:反引号``易看错,但更通用。$()易看,但有些shell 不支持,不过 openwrt支持。我倾向使用$()
比如:
match_ret=$(echo "${line}" | grep "\^" | grep -v grep)
或者
# 其中 tr -d '\r' 是因为该文件里面有\r\n,就是一行里面只有一个\r(回车符)
# tr -d 删除 字符
for line in `cat ${showat_info} | tr -d '\r'`
do
# 输出字符是 15个数字 \d 表示数字 {15} 表示重复15ci
match_ret=$(echo ${line} | egrep '^\d{15}')
done
(()) 表示 数学运算
# 说明:local 必须用于函数里面
# 当 shell [] 用于test时, [ conditon ] 中 conditon 和 左右[ ] 间隔一个字符,不要挨着
function test_while_circle(){
local count=0
while [ ${count} -le 5 ];do
echo ${count}
count=$(($count + 1))
done
}
在(()) 中的字符可以使用$ 也可以不使用$,直接使用变量名称,如
a=5; b=7; c=2
echo $(( a+b*c ))
echo $(($a+$b*$c))
$(( )) 还可作不同进制(如二进制、八进位、十六进制)转十进制运算
# 16# 表示 16进制,将# 后面的数值转换为10进制
echo $((16#25))
37
echo $((16#2a))
42
# 8# 8进制
echo $((8#21))
17
{}
$var 和 ${var} 都表示 获取var的值, 其中${} 表示的界限会更清晰。当然 ${}可用于 字符串删除,暂时没有使用到。参见示例:
参见网页:
https://zhuanlan.zhihu.com/p/82112596 有介绍 ${} 用于字符串删除相关
[] 、[[]] 和 (())
如上描述 [] 表示test ,与test的条件要间隔开
# -z 表示为empty,-n 表示不为空。 ${#var3} 表示var3的长度
if [ -z ${var1} ] || [ -z ${var2} ]; then
echo "var1 or var2 is empty then exit"
exit
fi
shell 使用正则匹配
比如匹配一个65.453.89.67.023 这种格式的数据,怎么匹配
匹配办法就是正则表达式:
echo 65.453.89.67.023 | egrep '\d{2}\.\d{3}\.(\d{2}\.){2}\d{3}
这个原理可以简单匹配IP地址:xxx.xxx.xxx.xxx 但是 IP地址还有一些其他限制
正则表达式简单说明:\d 匹配数字,{2} 和 {3} 出现两次三次,
()括号里面表示一个整体。(\d{2}\,){2} 表示括号里面的内容出现了两次。
\. 中\ 转义字符,. 含有特殊含义 匹配除换行符(\n、\r)之外的任何单个字符,,转义后,就表示.