Как использовать bc в заявлении bash if?
Я пытаюсь использовать bc для сравнения значения с десятичными знаками в моем операторе if. Я не уверен, правильно ли я использую bc в своем if statement
потому что это не похоже на работу. Это всегда входит в 4-й if statement
"IF4
Msgstr "Не похоже, что другие условия читаются правильно?
#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