Сравнение чисел с плавающей запятой с оператором if -else в сценарии оболочки

Переменные сокращены только для наглядности кода, нет необходимости изменять фактические более длинные (и более удобные )имена переменных.

Функциональный код можно сократить, используя один экземпляр identifyвместо четырех, используя readдля загрузки переменных, (с неэффективным использованием xargsдля сохранения строки кода ), плюс несколько bashизмов:

read mw1 mh1 mw2 mh2 <<< $(identify -ping -format "%w %h " [12].png)
mw="$((mw1>mw2?mw1:mw2))"
mh="$((mh1>mh2?mh1:mh2))"
echo {1,1,2,2}.png | xargs -n 2 convert -extent "${mw}x${mh}" -background transparent 

Или, может быть, чище использовать массивы вместо переменных:

read w[1] h[1] w[2] h[2] <<< $(identify -ping -format "%w %h " [12].png)
w[0]="$((w[1]>w[2]?w[1]:w[2]))"
h[0]="$((h[1]>h[2]?h[1]:h[2]))"
echo {1,1,2,2}.png | 
    xargs -n 2 convert -extent "${w[0]}x${h[0]}" -background transparent 
0
03.04.2021, 00:17
2 ответа

Bash не выполняет арифметические операции с плавающей запятой.

Но поскольку вам не нужен произвольный масштаб, вы просто вычисляете числа, увеличенные на сто, так что у вас остаются только целые числа, например.

lab=100 midterm=70 quiz=90 exam=80
total=$((25*lab + 30*midterm + 15*quiz + 30*exam))
if (( total >= 8000 )); then
    echo "you scored at least 80! (actually $(( total / 100 )))"
fi

Или вы можете использовать другой инструмент, который работает с числами с плавающей запятой, см.:
Как выполнять вычисления с целыми числами и числами с плавающей запятой в bash или других языках/фреймворках?

2
28.04.2021, 22:54

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

Простым способом было бы использование bc, который выводит 0для утверждений FALSE и 1для утверждений TRUE, операторы сравнения <, <=, >, >=, ==и !=. Они работают так, как вы их знаете.

 echo '1 > 2' | bc -l
 0
 echo '1 <= 2' | bc -l
 1

Таким образом, измените свои тесты на

 [ $(echo "$totalGrade >= 90.00" | bc -l) -eq 1 ]

и так далее.

Подсказка 1

elif [ $totalGrade -ge 80.00 -a $totalGrade -le 84.00 ]

В этом выражении -a $totalGrade -le 84.00является избыточным, так как цикл IF -оценивается в том же порядке, что и в сценарии, поэтому $totalGrade -le 84.00уже позаботился, когда $totalGrade -ge 85.00имеет значение FALSE.

Подсказка 2 Что произойдет, если оценка будет 84,5? В ваших оценках отсутствуют эти значения.

1
28.04.2021, 22:54

Теги

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