代码之家  ›  专栏  ›  技术社区  ›  LandonSchropp

bash脚本和BC

  •  11
  • LandonSchropp  · 技术社区  · 14 年前

    我正在写一个bash脚本,我需要做一些浮点运算。基本上我想这样做:

    NUM=$(echo "scale=25;$1/10" | bc)
    if [ $? -ne 0 ]
    then
    echo bad
    fi
    

    我遇到的问题是美元?倾向于保存来自echo程序的输出,而不是bc调用。有没有方法将BC程序的输出保存到变量中?

    编辑:

    谢谢你的快速回复。这是另一种看待问题的方法。假设我修改了一点脚本,使其看起来像这样:

    #!/bin/bash
    NUM=$(echo "scale=25;$1/10" | bc)
    if [ $? -ne 0 ]
    then
    echo bad
    exit
    fi
    echo "$NUM"
    

    当用户输入正常的浮点值时,它工作正常:

    bash script.sh 1.0
    

    输出:

    .1000000000000000000000000
    

    但是,当用户输入错误值时,脚本无法恢复:

    bash script.sh 1.0a
    

    输出:

    (standard_in) 1: parse error
    

    我要做的是让它优雅地退出。

    3 回复  |  直到 11 年前
        1
  •  8
  •   ghostdog74    14 年前

    我看不出有什么问题。$num应该是你的 bc 命令结果

    见:

    NUM=$(echo "scale=25;$1/10" | bc)
    echo "\$? is $?"
    echo "NUM is $NUM"
    

    输出

    $ ./shell.sh 10
    $? is 0
    NUM is 1.0000000000000000000000000
    

    另一种方法是用锥子

    NUM=$(awk -vinput="$1" 'BEGIN{printf "%.25f", input/10 }')
    echo "\$? is $?"
    echo "NUM is $NUM"
    

    另一种方法是,在您通过 公元前 . 如

    shopt -s extglob
    input="$1"
    case "$input" in
     +([0-9.]))
         IFS="."; set -- $input
         if [ $# -ne 2 ];then
            echo "bad decimal"
         else
            NUM=$(echo "scale=25;$1/10" | bc  )
            echo "$NUM"
         fi
    esac
    

    你不必检查 $? 公元前 不再

        2
  •  2
  •   Dennis Williamson    14 年前

    对于GNU bc ,将在stderr上输出类似于“(standard_in)1:语法错误”的错误。您可以在变量中捕获它并检查它。

    #!/bin/bash
    NUM=$(echo "scale=25;$1/10" | bc 2>&1)
    if [[ $NUM =~ error || $? -ne 0 ]]
    then
        echo bad
        exit
    fi
    echo "$NUM"
    
        3
  •  1
  •   stefanB    14 年前

    您是在从BC(存储在num中)计算结果之后,还是在从系统调用返回状态之后?

    正如我说的,你有计算结果 $NUM :

    #bctest.sh
    NUM=$(echo "scale=25;$1/10" | bc)
    if [ $? -ne 0 ]
    then
    echo bad
    fi
    
    echo "result: ", $NUM
    

    测试:

    bash ./bctest.sh 15
    result: , 1.5000000000000000000000000