在bash里进行数学运算

在bash里进行使用运算表达式的方式很多,也很简单,看例子即可:
把65的平方赋值给index变量
((index=65*65))
let index=65*65
index=`expr  65 \* 65`
对index进行递增
((index++))
let index++
第一个例子里,用到了三种不同的方法,效果是一样的。需要注意的是第三种方法。该方法结合了expr命令和执行操作符`。expr的作用是对后面的运算表达式计算,然后把结果输出,而`用来获得输出,返回给index。在expr后的表达式里,各个部分必须用空格分开,一些特殊字符,例如乘号*必须在前面加个反斜杠转义。
用expr不能直接进行对变量的自增操作,所以在第二个例子里,我没有用到expr这种方式。
let和(())的作用基本一样,唯一的不同是,let后面的运算表达式各个部分不能有空格隔离开,这个和expr正好相反。而(())里面的运算表达式,空格是无关紧要的,存在与否都不会对运算有影响。
bash里的算术表达式有如下操作符:

[阅读全文...]

一个shell写的urldecode代码

一个同事来找我,说如何把url的代码做decode,我也没有搞过!google了一下,有人写的很多,但是把代码copy后总是有语法错误。下面是我调试后的原代码,copy就能用!自己也留个记忆吧!
这是第一种方法:(标点符号会漏掉)

#!/bin/sh
awk ‘
BEGIN {
hextab=”0123456789ABCDEF”
for ( i=1; i<=255; ++i ) ord [i] = sprintf(“%c”,i);
}
{
decoded = “”
for ( i=1; i<=length ($0); ++i ) {
c = substr ($0, i, 1)
if ( c ~ /[a-zA-Z0-9.-]/ ) {
decoded = decoded c             # safe character
} else if ( c == ” ” ) {
decoded = decoded “+”   # special handling
} else if ( c == “%” ) {
hi= substr($0,i+1,1);
low=substr($0,i+2,1);
i++;i++
decoded = decoded ord[(index(hextab,hi)-1)*16+index(hextab,low)-1]
}
}
}
END {print decoded}

这是第二种方法:

#/bin/sh
awk ‘BEGIN {
for(i=0;i<10;i++)
hex[i]=i;
hex["A"]=hex["a"]=10;
hex["B"]=hex["b"]=11;
hex["C"]=hex["c"]=12;
hex["D"]=hex["d"]=13;
hex["E"]=hex["e"]=14;
hex["F"]=hex["f"]=15;
}
{
gsub(/\+/,” “);
i=$0;
while(match(i,/%../)){
if(RSTART>1);
printf”%s”,substr(i,1,RSTART-1);
printf”%c”,hex[substr(i,RSTART+1,1)]*16+hex[substr(i,RSTART+2,1)];
i=substr(i,RSTART+RLENGTH);
}
print i;
}’