Skip to content

Obtenir l’entier plafond à partir du nombre sous Linux (BASH)

Solution:

Pourquoi utiliser des langages de script externes ? Vous obtenez la parole par défaut. Pour obtenir le plafond, faites

$ divide=8; by=3; (( result=(divide+by-1)/by )); echo $result
3
$ divide=9; by=3; (( result=(divide+by-1)/by )); echo $result
3
$ divide=10; by=3; (( result=(divide+by-1)/by )); echo $result
4
$ divide=11; by=3; (( result=(divide+by-1)/by )); echo $result
4
$ divide=12; by=3; (( result=(divide+by-1)/by )); echo $result
4
$ divide=13; by=3; (( result=(divide+by-1)/by )); echo $result
5
....

Pour prendre en compte les nombres négatifs, vous pouvez le renforcer un peu. Des chemins probablement plus propres, mais pour commencer

$ divide=-10; by=10; neg=; if [ $divide -lt 0 ]; then (( divide=-divide )); neg=1; fi; (( result=(divide+by-1)/by )); if [ $neg ]; then (( result=-result )); fi; echo $result
-1

$ divide=10; by=10; neg=; if [ $divide -lt 0 ]; then (( divide=-divide )); neg=1; fi; (( result=(divide+by-1)/by )); if [ $neg ]; then (( result=-result )); fi; echo $result
1

(Modifié pour passer let ... à (( ... )).)

Appel à un langage de script avec une fonction ceil. Étant donné $NUMBER:

python -c "from math import ceil; print ceil($NUMBER/500.0)"

ou

perl -w -e "use POSIX; print ceil($NUMBER/500.0), qq{n}"

Voici une solution utilisant bc (qui devrait être installée à peu près partout):

ceiling_divide() {
  ceiling_result=`echo "($1 + $2 - 1)/$2" | bc`
}

En voici un autre purement en bash:

# Call it with two numbers.
# It has no error checking.
# It places the result in a global since return() will sometimes truncate at 255.

# Short form from comments (thanks: Jonathan Leffler)
ceiling_divide() {
  ceiling_result=$((($1+$2-1)/$2))
}

# Long drawn out form.
ceiling_divide() {
  # Normal integer divide.
  ceiling_result=$(($1/$2))
  # If there is any remainder...
  if [ $(($1%$2)) -gt 0 ]; then
    # rount up to the next integer
    ceiling_result=$((ceiling_result + 1))
  fi
  # debugging
  # echo $ceiling_result
}



Articles Similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.