Как использовать bc в заявлении bash if?

Я пытаюсь использовать bc для сравнения значения с десятичными знаками в моем операторе if. Я не уверен, правильно ли я использую bc в своем if statement потому что это не похоже на работу. Это всегда входит в 4-й if statement "IF4Msgstr "Не похоже, что другие условия читаются правильно?

 #SET INITIAL SPEED
initialspeed() {

wpm=0
echo wpm: $wpm
#CHECKS IF SPEED WAS GIVEN
if [ -z "$wpm" ]
then
        let wpm=0.6
        echo IF1 wpm: $wpm #DEBUG
#CHECK IF SPEED IS VALID
elif [ 'echo "if$($wpm > 0.6)1;if$($wpm<=0.6)0" | bc' = 1 ]
then
        echo IF2 wpm: $wpm #DEBUG
        echo Error speed is less than 100 wpm
        exit 3
elif [ 'echo "if$($wpm < 0.06)1;if$($wpm<=0.06)0" | bc' = 1 ]
then
        echo IF3 wpm: $wpm #DEBUG
        echo Error speed is more than 1000 wpm
exit 3
else
        wpm=$(echo "scale=2;60/$2 | bc")
        echo IF4 wpm: $wpm #DEBUG
fi
}

РЕДАКТИРОВАТЬ: Я на самом деле пытаюсь написать сценарий, похожий на скорость чтения "spritz". $1 - это файл для чтения, а $2 - скорость, с которой слова будут отображаться на экране. $2 является необязательным аргументом, если он не указан, я устанавливаю скорость по умолчанию.

Скорость должна быть от 100 до 1000 об / мин (от 0,6 до 0,06 перед расчетом).

3 ответа

Решение

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

if [ `command` = "result" ]; then  # notice `command` vs 'command'

но предпочтительный современный синтаксис

if [ $(command) = "result" ]; then

но это все еще довольно запутанно - как правило, вы хотите что-то вроде

if command; then

где возможно command это немного более сложная вещь, чем у вас изначально.

В этом конкретном случае я бы вместо этого обернул вашу логику в простой скрипт Awk.

Вы должны вызывать это с помощью значения wpm; если он отсутствует, предоставляется значение по умолчанию 0,6.

initialspeed() {
    local wpm
    wpm=${1:-0.6}
    echo "wpm: $wpm" >&2 # notice quoting
    echo "$wpm" | awk '$1 > 0.6 {
            print "Error: speed $1 is less than 100 wpm" >"/dev/stderr"; exit 3 }
        $1 < 0.06 {  # You had < 0.06 vs <= 0.06 but I guess this is what you meant
            print "Error: speed $1 is more than 1000 wpm" >"/dev/stderr"; exit 3 }
        { printf "%2.2f\n", 60/$1 }'
}

Ваш оригинальный скрипт, по-видимому, имеет неправильное сравнение для значения 0,06. Глядя на это сейчас, я предполагаю, что вы действительно хотите, чтобы значение было между 0,06 и 0,6 включительно; но в любом случае это всего лишь эскиз, с которым вы можете работать.

Вы можете передать свой тест в BC с

echo "$wpm > 0.06" | bc

Тестирование результата возможно с

if [ $(echo "$wpm > 0.06" | bc) -eq 1 ]; then
    echo "You are going to fast"
else
    echo "Slow"
fi

Если вы намереваетесь вернуть 0 или 1 в зависимости от значения wpm, вам нужно что-то вроде этого

echo "if ( $wpm > 0.6 ) 1 else 0" | bc
Другие вопросы по тегам