busybox的shell是ash,ash不同于主机上的sh bash tcsh,它是个精简版,很多标准shell支持的特性它都不支持。
1. 序列生成
ash不支持内部运算符 ${begin..end}
必须用 $(seq $start $step $stop)
例:
echo $(seq 10)
2. for 循环
start=1
step=2
stop=100
list=$(seq $stop)
for m in list;do
echo m=$m
done
3. 算术运算
发现shell脚本攻略中的方法全都不能使用
ash不支持 i=`expr $j + $m` i=$[ j + m]
只能支持 i=$(($j + $m))
例:
leafid=$((($m-1)*$MAX_N + $n))
4. grep与正则表达式
匹配为数字开头行 grep "^[0-9]" file
匹配以空格结尾的行 grep "[' ']$" file
获取数字开头
并且 以空格或tab符结尾的行 grep -n "^[0-9]" mark.data | grep -e "[' ']$" -e "['\t']$"
grep单个表达式只能支持多个条件的或,多个条件的与只能用 管道 来做。
5. 变量的间接引用
indirect_var_get()
{
local raw=$1
eval val=\${$raw}
echo "$val"
}
做成了函数,方便用在循环中
例子:
wn=2
rate2=1200
rate=$(indirect_var_get rate${wn})
rate=1200
6. awk 的各种用法
1)位运算 a=1, b=`awk "BEGIN{f=lshift($a, 3); print f}"` a左移3位
2)文件行数 awk 'END{print NR}' file
3)某域到最后一个域,后台进程的启动命令
local pid=$$
local name=`ps -w |grep -w $pid | grep -v grep | awk '{for(i=5;i<=NF;i++) printf("%s ", $i)}'`
4)筛出包含 $key (支持正则表达式)关键字的行 awk -F: "/${key}/" file
7. sed的用法
1)删除文件中的注释行
sed '/^[ \t]*#.*/d' -i file sed '/^[ \t]*#.*/d' file
2)替换每行的字符串 abc 到 123
sed 's/abc/123/g' file
3)删除每行的字符串
sed 's/abc//g' file
4)条件替换,只有包含$key的行
sed "/^${key}/ s/abc.*$/123/" -i file
阅读(7541) | 评论(0) | 转发(1) |