【问题标题】:(standard_in) 1: parse error bash to calculate mean of a record(standard_in) 1: 解析错误 bash 以计算记录的平均值
【发布时间】:2017-10-16 08:42:51
【问题描述】:

我不断得到标准:解析器错误

#!bin/bash


file="0.txt"

if [ -f $file ] ; then
    rm $file
fi


for i in {1..4};
 do cat $i'_Node_770_01_Band_600_Min_Res.txt' >> 0.txt;
done

############# MAXIMUM ############
function maximum() {
   column="$1"
    awk '{print $'$column';}' 0.txt | sort -nr | head -n 1
    return 0
}

############MINIMUM#############
function minimum() {
    column="$1"
    awk '{print $'$column';}' 0.txt | sort -nr | tail -n 1
}   

############AVERAGE###########
function average(){
    max="$1"
    min="$2"
    div="2"
    diff=$(echo "scale=4; $max-$min" | bc)
    ave=$(echo "scale=4; $diff/$div" | bc)
    echo $ave
}

input="0"
while true; do
    read -p "Enter column [1-10] ('q' to quit): " input;

    if [ "$input" == "q" ];
        then
            clear
            echo "Goodbye!"
        break
    elif [ "$input" == "Q" ]; 
       then
            clear
            echo "Goodbye!"
        break
    elif (("$input" < "1")) || (("$input" > "10"));
        then
            clear
            echo -e "\t\t Try again"

    else
        #store maximum in variable max
        maximum $input read -r max
        #store minimum in variable min
        minimum $input read -r min
        #echo $min
        average $max $min 
    break
    fi

done

我相信解析器问题在于函数平均值。我不知道如何解决这个问题。我试过修复: max=$(最大$输入) min=$(最小$输入) 平均 $max $min 无济于事。

【问题讨论】:

  • #!bin/bash => #!/bin/bash
  • max=$(maximum $input) 是对的。 'read', '-r', 'max' 只是函数的参数。为最大值和最小值添加空值异常处理。
  • 作为if [ -f $file ] 块的简写,您可以简单地使用:&gt;"0.txt"截断(清空)文件(如果存在)或创建一个空文件(如果存在)不是。通常,您希望双引号test(例如[...])一起使用的任何变量,以防止在变量包含空格或为空时出错。 (这里你在测试上方明确设置了file,所以没有任何可能,但这是一种很好的做法)。如果您想避免引用,请使用[[...]]
  • @thatseeyou,您可以在 cmets 中用 backticks (例如 '`')将代码部分设置为固定宽度字体并设置灰白色背景. (仅供将来参考)。在您的答案中也是如此。
  • 我恢复到上一行代码:function average(){ div="2" diff=$(echo "scale=4; $1-$2" | bc) ave=$(echo "scale=4; $diff/$div" | bc) echo $ave },只是为了表明我正在解析的值是数字,这是我收到的消息:输入列 [1- 10] ('q' 退出): 4 -83.3873 -88.7882 (standard_in) 2: 解析错误 (standard_in) 1: 解析错误

标签: bash function parsing while-loop


【解决方案1】:

解析错误来自 bc 命令,可能是 unsetemptynon-计算中使用的数值变量;在这种情况下,罪魁祸首很可能是maxmin

示例:如果maxmin 均未设置,则提供默认(数字)值将防止bc 发出解析错误:

function average(){
  max="${1:-0}"
  min="${2:-0}"
  ...
}

理想情况下,您应该在输入中加入一种稳健的验证形式,这超出了问题的范围,但这应该有助于理解 解析错误 的基本原理。

【讨论】:

  • 感谢您的意见。我尝试了修订版,但它给了我这个:(standard_in)1:非法字符::(standard_in)1:解析错误(standard_in)1:非法字符::(standard_in)1:解析错误;我最初没有 max="$1" 和 min="$1" 但它是相同的错误消息。
  • @CNSp - 您使用的是max="${1:-0}" 而不是max="${1-:0}" 正确(即colondash 之前)。在这种情况下,您也可以完全删除冒号。 (例如max="${1-0}")。额外的: 仅在参数已声明但为空时才会有所不同。 parameter substitution.
  • @CNSp – 调用average函数时maxmin的值是多少?
  • 它们都是数字的,因为它处理所有数字记录的 10 列。以下是选择特定列时的情况:输入列 [1-10]('q' 退出):4 -83.3873 -88.7882(标准输入)2:解析错误(标准输入)1:解析错误
  • 所以,这两个值来自函数最大值和最小值。我最初有这样的代码:function average(){ div="2" diff=$(echo "scale=4; $1-$2" | bc) ave=$(echo "scale=4; $diff/$div" | bc) echo $ave } 主体中的调用函数是maximum $input read -r max minimum $input read -r min average $max $min,因为我认为这些值将存储在变量 max 和 min 中,这两个值将解析为 $1 和$2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
相关资源
最近更新 更多