Сценарии Bash и до н.э

Я пытаюсь записать сценарий удара, и я должен был сделать некоторые математические операции с плавающей точкой. В основном я хочу сделать что-то вроде этого:

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

Проблемой, с которой я сталкиваюсь, является $? имеет тенденцию содержать вывод из программы эха а не до н.э вызов. Существует ли способ, которым я сохраняю вывод от до н.э программа в переменную?

Править:

Спасибо за быстрые ответы. Вот другой способ посмотреть на проблему. Скажите, что я изменил сценарий немного, таким образом, он похож на это:

#!/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

То, что я пытаюсь сделать, заставляют это выходить корректно.

11
задан LandonSchropp 9 July 2013 в 23:44
поделиться

3 ответа

Я не вижу ничего плохого. $ NUM должен содержать результаты вашей команды bc

см.:

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

output

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

другой способ - использовать awk

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

Другой способ - выполнить проверку "$ 1" прежде чем перейти к до н.э. . например,

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

вам больше не нужно проверять $? из bc

8
ответ дан 3 December 2019 в 09:40
поделиться

Для GNU bc ошибка, подобная «(standard_in) 1: syntax error», будет выводиться на stderr. Вы можете зафиксировать это в своей переменной и проверить это.

#!/bin/bash
NUM=$(echo "scale=25;$1/10" | bc 2>&1)
if [[ $NUM =~ error || $? -ne 0 ]]
then
    echo bad
    exit
fi
echo "$NUM"
2
ответ дан 3 December 2019 в 09:40
поделиться

Вам нужен результат вычисления из 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
1
ответ дан 3 December 2019 в 09:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: