Bash 将此处字符串BC计算的输出存储到变量中以进行错误检查

Bash 将此处字符串BC计算的输出存储到变量中以进行错误检查,bash,output,calculator,herestring,Bash,Output,Calculator,Herestring,我有一个学校作业,就是创建一个脚本,可以用运算顺序计算任意长度的数学方程。我在这件事上遇到了一些麻烦,最后发现了这里的弦。脚本的最大问题似乎是错误检查。 我尝试使用$?,检查bc的输出,但是无论是成功还是失败都是0。作为响应,我现在尝试将here字符串的输出存储到一个变量中,然后使用regex检查输出是否以数字开头。下面是我希望存储在变量中的一段代码,后面是我脚本的其余部分 #!/bin/bash set -f #the here-string bc command I wish to stor

我有一个学校作业,就是创建一个脚本,可以用运算顺序计算任意长度的数学方程。我在这件事上遇到了一些麻烦,最后发现了这里的弦。脚本的最大问题似乎是错误检查。 我尝试使用$?,检查bc的输出,但是无论是成功还是失败都是0。作为响应,我现在尝试将here字符串的输出存储到一个变量中,然后使用regex检查输出是否以数字开头。下面是我希望存储在变量中的一段代码,后面是我脚本的其余部分

#!/bin/bash
set -f
#the here-string bc command I wish to store output into variable
cat << EOF | bc
scale=2
$*
EOF


read -p "Make another calculation?" response
while [ $response = "y" ];do
    read -p "Enter NUMBER OPERATOR NUMBER" calc1
cat << EOF | bc
scale=2
$calc1
EOF
read -p "Make another calculation?" response
done
~

这应该可以做到:

#!/bin/sh

while read -p "Make another calculation? " response; [ "$response" = y ]; do
    read -p "Enter NUMBER OPERATOR NUMBER: " calc1
    result=$(bc << EOF 2>&1
scale=2
$calc1
EOF
)
    case $result in
    ([0-9]*)
         printf '%s\n' "$calc1 = $result";;
    (*)
         printf '%s\n' "Error, exiting"; break;;
    esac
done
请注意,您可能不需要这样的here文档:

result=$(echo "scale=2; $calc1" | bc 2>&1)

这应该可以做到:

#!/bin/sh

while read -p "Make another calculation? " response; [ "$response" = y ]; do
    read -p "Enter NUMBER OPERATOR NUMBER: " calc1
    result=$(bc << EOF 2>&1
scale=2
$calc1
EOF
)
    case $result in
    ([0-9]*)
         printf '%s\n' "$calc1 = $result";;
    (*)
         printf '%s\n' "Error, exiting"; break;;
    esac
done
请注意,您可能不需要这样的here文档:

result=$(echo "scale=2; $calc1" | bc 2>&1)

猫的无用用途。今天保存一个管道并使用bc谢谢我会尝试,但是你知道如何将输出存储在变量中吗?顺便说一句,我是你的朋友。[$response=y]引用了完全错误的东西-y不需要被引用,因为它是一个常量,$response确实需要被引用,因为它是一个扩展。只是一个注释。这个命令对猫毫无用处。今天保存一个管道并使用bc谢谢我会尝试,但是你知道如何将输出存储在变量中吗?顺便说一句,我是你的朋友。[$response=y]引用了完全错误的东西-y不需要被引用,因为它是一个常量,$response确实需要被引用,因为它是一个扩展。只是一个注释。顺便说一句,命令read-p是否与/bin/sh一起有效?我当时的印象是,这是一种巴什主义,在我的书中看不到。尽管如此,dash实施的巴什主义并不算什么巴什主义@CharlesDuffy是的,这不是POSIX,但不是bashism,更像是manyshellism:-。FreeBSD ash、zsh和其他人可能都接受它。当然,大多数巴什主义实际上都是从ksh开始的,并且也被其他精神继承者所接受。考虑到POSIX sh本身受早期ksh的影响有多大……感谢Jens,您在没有此处文档的情况下进行计算的解决方案非常有效。我可以进行错误检查并显示使用信息:@KieranO'Connor很乐意提供帮助。欢迎访问Stackoverflow.BTW,read-p是否与/bin/sh一起有效?我当时的印象是,这是一种巴什主义,在我的书中看不到。尽管如此,dash实施的巴什主义并不算什么巴什主义@CharlesDuffy是的,这不是POSIX,但不是bashism,更像是manyshellism:-。FreeBSD ash、zsh和其他人可能都接受它。当然,大多数巴什主义实际上都是从ksh开始的,并且也被其他精神继承者所接受。考虑到POSIX sh本身受早期ksh的影响有多大……感谢Jens,您在没有此处文档的情况下进行计算的解决方案非常有效。我可以进行错误检查并显示使用信息:@KieranO'Connor很乐意提供帮助。欢迎来到Stackoverflow。