2012年2月4日土曜日

[Shell 基础] 数值操作

1. 数值比较
-eq -> =
-ne -> !=
-lt -> <
-gt -> >
-le -> <=
-ge -> >=

if test 1 -eq 1; then
    echo "yes"
fi

if [ 1 -eq 1 ]; then
    echo "yes"
fi
================================================================================
2. 计算

2-1. expr
2-1-1. 计算符两边必须有空格
2-1-2. 只能计算整数
a=`expr 5 + 3`
b=`expr 5 - 3`
ab=`expr $a + $b`
c=`expr 5 \* 3`
d=`expr 5 / 3`
e=`expr 5 % 3`

2-2. let
2-2-1. 计算符两边不能有空格
2-2-2. 只能计算整数
$ n=1;let n+=1;echo $n
2

2-3. $(())
2-3-1. $((09-1)), 会把 09 当作八进制来计算, 此时应该使用 expr 或 let 等
$echo $((09-1))
bash: 09: value too great for base (error token is "09")

2-4. 小数计算
2-4-1. 使用 awk (四舍五入 5 位小数)
$ awk 'BEGIN{print 10/3}'
3.33333

$ awk 'BEGIN{print 1.222222/1.333333}'
2.55556

#!/bin/sh
x=1.222222
y=1.333333
r=`echo "${x} ${y}" | awk '{print ($1+$2)}'`
echo $r

2-4-2. 使用 bc
$ echo 10/3 | bc -l
3.33333333333333333333

#!/bin/sh
x=1.22222222222222222222222222222222222222222222
y=1.33333333333333333333333333333333333333333333
echo $x+$y | bc -l

================================================================================
3. 格式化

3-1. 千分位分隔符
$ printf "%'.2f\n" 123456.789
123,456.79
================================================================================
4. 判断是否为数字

4-1. 整数
#!/bin/bash
echo "Please input a number"
read num

expr $num "+" 10 > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "$num is a num"
else
    echo "$num not a num"
fi

4-2. 小数
#!/bin/sh
x=7.0
y=6.3
r=`echo "${x}>${y}" | awk -F '>' '{ print ($1 > $2 ? "yes" : "no") }'`
echo "x=${x}, y=${y}; x>y ? ${r}"

x=5.5
y=6.3
r=`echo "${x}>${y}" | awk -F '>' '{ print ($1 > $2 ? "yes" : "no") }'`
echo "x=${x}, y=${y}; x>y ? ${r}"

x=6.3
y=6.3
r=`echo "${x}>${y}" | awk -F '>' '{ print ($1 > $2 ? "yes" : "no") }'`
echo "x=${x}, y=${y}; x>y ? ${r}"
================================================================================

0 件のコメント:

コメントを投稿