Переменные сокращены только для наглядности кода, нет необходимости изменять фактические более длинные (и более удобные )имена переменных.
Функциональный код можно сократить, используя один экземпляр 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
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 или других языках/фреймворках?
Во-первых,: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? В ваших оценках отсутствуют эти значения.