发布新日志

  • 【转 】shell计算明天和昨天日期的函数

    2010-10-19 14:59:34

    #返回月份的天数
    get_mon_days()
    {
    Y=`expr substr $1 1 4`
    M=`expr substr $1 5 2`

    r1=`expr $Y \% 4`
    r2=`expr $Y \% 100`
    r3=`expr $Y \% 400`

    case $M in
    01|03|05|07|08|10|12) days=31;;
    04|06|09|11) days=30;;
    esac
    if [ $M -eq 02 ]
    then
    if [ r1 -eq 0 -a r2 -ne 0 -o r3 -eq 0 ]
    then
    days=29
    else
    days=28
    fi
    fi
    echo $days
    }
    #返回昨天日期
    get_before_date()
    {
    Y=`expr substr $1 1 4`
    M=`expr substr $1 5 2`
    D=`expr substr $1 7 2`
    YY=`expr $Y - 1`
    MM=`expr $M - 1`
    DD=`expr $D - 1`
    MM=`printf "%02d" $MM`
    DD=`printf "%02d" $DD`
    dd=$Y$MM
    dad=`get_mon_days $dd`
    be_date=$Y$M$DD
    if [ $D -eq 01 ]
    then
    if [ $M -ne 01 ]
    then
    be_date=$Y$MM$dad
    fi
    if [ $M -eq 01 ]
    then
    be_date=$YY"1231"
    fi
    fi
    echo $be_date

    }
    #返回明天日期
    get_next_date()
    {
    Y=`expr substr $1 1 4`
    M=`expr substr $1 5 2`
    D=`expr substr $1 7 2`
    YY=`expr $Y + 1`
    MM=`expr $M + 1`
    DD=`expr $D + 1`
    MM=`printf "%02d" $MM`
    DD=`printf "%02d" $DD`
    r1=`expr $Y \% 4`
    r2=`expr $Y \% 100`
    r3=`expr $Y \% 400`

    next_date=$Y$M$DD

    if [ $D -eq 30 ]
    then
    case $M in
    04|06|09|11) next_date=$Y$MM"01";;
    esac
    fi
    if [ $D -eq 31 ]
    then
    next_date=$Y$MM"01"
    case $M in
    12) next_date=$YY"0101";;
    esac
    fi
    if [ $M -eq 02 ]
    then
    if [ r1 -eq 0 -a r2 -ne 0 -o r3 -eq 0 ]
    then
    if [ $D -eq 29 ]
    then
    next_date=$Y$MM"01"
    fi
    else
    if [ $D -eq 28 ]
    then
    next_date=$Y$MM"01"
    fi
    fi
    fi
    echo $next_date
    }


  • shell 运算和进制转换

    2010-10-19 14:56:57

    【转 】shell 运算和进制转换

    Shell 提供大量的基本运算操作,在脚本中非常有用。Shell 对您提供的算术表达式求值,执行运算展开式,此时使用得出的结果替换表达式。以下面的格式提供运算表达式:

    $(( expression ))

                           


    您可以使用 echo 在命令行显示运算展开式的结果,了解其工作情况。现在尝试清单 5 所显示的结果。

    清单 5. Bourne Shell 中的运算展开式

                        

                            $ echo $((10+40))

                            50

                            $ echo $((5*(3+3)))

                            30

                           


    您还可以将展开式分配给变量。尝试清单 6 所显示的结果。

    清单 6. 将运算展开式分配给 Shell 变量

                        

                            $ myvar = 10

                            $ echo $myvar

                            10

                            $ echo $(($myvar-2))

                            8

                            $ myvar = $(($myvar+5))

                            $ echo $myvar

                            15

                            $ result = $(($myvar-10))

                            $ echo $result

                            5

                            $

                           


    表 2 列出了在大多数 Bourne 以及与 Bourne 兼容的 Shell中可以使用的运算符。正如上面第二个示例,使用圆括号括起来的语句有更高的优先级。实际上,Shell 算术优先级通常根据 C 语言的规则来确定。

    表 2. Shell 条件表达式
    运算符     描述
    +     加
    -     减
    *     乘
    /     除
    %     求余
    <     小于(1 代表真,0 代表假)
    <=     小于等于(1 代表真,0 代表假)
    >     大于(1 代表真,0 代表假)
    >=     大于等于(1 代表真,0 代表假)
    <<     按位向左移位:将给定的整数或第一个表达式向左移动第二个表达式表示的位数
    >>     按位向右移位:将给定的整数或第一个表达式向右移动第二个表达式表示的位数


    使用 Shell 运算进行进制转换

    假 定在您的脚本中有一些数字,您需要以另外的进制处理这些数字。使用 Shell 运算可以很容易地自动实现这类转换。一种情况是使用 Shell 运算把一个数字从给定的进制转换位十进制。如果数字以运算展开式的形式提供,那么假定它带有十进制符号,除非 它前面带有 0(这种情况假定是八进制)或 0x(这种情况假定是十六进制)。键入以下内容以得到一些八进制和十六进制值的十进制输出:

    $ echo $((013))

     $ echo $((0xA4))

                                           
    您还可以使用以下格式指定 2 到 64 之间的任意进制:

    $((BASE#NUMBER))                 
    通过在 Shell 提示符后键入清单 7 中所示的行,尝试将二进制、八进制、十六进制以及其他进制的数转换为十进制。

    清单 7. 在 Shell 中将任意进制的数以十进制输出
                      

                            echo $((2#1101010))

                            echo $((8#377))

                            echo $((16#D8))

                            echo $((12#10))

                            echo $((36#ZZYY))

                           


    使用 bc 进行进制转换

    在 Shell 中进行进制转换的另一个诀窍是使用 bc, 它是一种任意精度运算语言,大多数 UNIX 安装程序都提供。因为它允许您指定输出进制,所以当您需要以十进制以外的进制输出时,这是一种很好的技术。

    bc 的特殊变量 ibase 和 obase 分别包含用于输入和输出的进制的值。缺省情况下,都被设置为 10。要执行进制转换,需要改变其中的一个或两个值,然后提供一个数字。立即尝试,如清单 8 中所示。

    清单 8. 使用 bc 执行进制转换

                        
                            $ bc -ql

                                                10

                            10

                            base=16

                                                10

                            A

                            ibase=2

                                                10

                            2

                           

                                                     Control-D

                                               

                            $

                           
    要快速执行进制转换,可以联合使用 bc 和 echo形成快捷的单命令行程序,将给定的值通过管道传输给 bc。键入清单 9 中显示的内容。

    清单 9. Shell 单命令行 bc 程序

                        

                            $ echo 'obase=16; 47' | bc

                            2F

                            $ echo 'obase=10; ibase=16; A03' | bc

                            2563

                            $

                           


    警告:当您设置 bc 的输入进制以后,输入 bc 的所有数字都使用该进制,包括您提供用于设置输出进制的数字。因此最好先设置输出进制,否则可能会产生意想不到的结果,如清单 10 中所示。

    清单 10. 设置输入和输出进制的先后顺序的重要性

                        

                            $ echo 'ibase=16; base=10; A' | bc

                            A

                            $ echo 'ibase=16; base=A; A' | bc

                            10

                            $

                           

    运 算符类型
    按位运算符
    ~, <<, >>, &, |, ^
    $[]表示形式告诉 shell 对方括号中的表达式求值
    shell运算符
    表达式替换
    $[ ] 和 $(())
    两种格式功能一样,所有的 shell 的求值都是用整数完成
    $[ ] 可以接受不同基数的数字
    shell运算符
    赋值运算符
    =、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=

Open Toolbar