sirve scripts script que programas programacion pasar parametros para operaciones español ejemplos comandos aritmeticas linux bash shell ceil ceiling

linux - que - scripts bash ejemplos



Obtener el número entero de techo de número en linux(BASH) (11)

¿Por qué usar lenguajes de script externos? Obtienes piso por defecto. Para obtener el cielo, haz

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

Para tener en cuenta los números negativos, puedes reforzarlo un poco. Probablemente formas más limpias, pero para empezar

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

¿Cómo haría algo como esto?

ceiling(N/500)

N representa un número.

Pero en un script Bash de Linux


Ampliando un poco la gran respuesta de Kalle , este es el algoritmo muy bien empaquetado en una función:

ceildiv() { local num=$1 local div=$2 echo $(( (num + div - 1) / div )) }

o como un trazador de líneas:

ceildiv(){ echo $((($1+$2-1)/$2)); }

Si quieres ser elegante, podrías usar una versión más robusta que valida la entrada para verificar si son numéricos, también maneja números negativos:

ceildiv() { local num=${1:-0} local div=${2:-1} if ! ((div)); then return 1 fi if ((num >= 0)); then echo $(( (num + div - 1) / div )) else echo $(( -(-num + div - 1) / div )) fi }

Esto utiliza un límite "falso" para números negativos, al entero absoluto más alto, es decir, -10 / 3 = -4 y no -3 como debería, como -3> -4. Si quiere un límite "verdadero", use $(( num / div )) en su lugar después del else

Y luego úsalo como:

$ ceildiv 10 3 4 $ ceildiv 501 500 2 $ ceildiv 0 3 0 $ ceildiv -10 1 -10 $ ceildiv -10 3 -4


Aquí hay una solución que utiliza bc (que debe instalarse prácticamente en todas partes):

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

Aquí hay otro puramente 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 }


Esta es una solución simple usando Awk:

Si quiere el tope de ($ a / $ b) use

echo "$a $b" | awk ''{print int( ($1/$2) + 1 )}''

y el uso del piso

echo "$a $b" | awk ''{print int($1/$2)}''

Tenga en cuenta que me acabo de repetir el dividendo ''$ a'' como el primer campo de la línea a awk y el divisor ''$ b'' como el segundo.


Esta función no agregará 1, si la división devuelve un número no flotante.

function ceiling { DIVIDEND=${1} DIVISOR=${2} if [ $(( DIVIDEND % DIVISOR )) -gt 0 ]; then RESULT=$(( ( ( $DIVIDEND - ( $DIVIDEND % $DIVISOR ) ) / $DIVISOR ) + 1 )) else RESULT=$(( $DIVIDEND / $DIVISOR )) fi echo $RESULT }

Úselo así:

echo $( ceiling 100 33 ) > 4


Llamar a un lenguaje de scripting con una función ceil. Dado $NUMBER :

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

o

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


Matemáticamente, la función del techo se puede definir con piso, techo (x) = piso (-x). Y, floor es el predeterminado al convertir un float positivo en entero.

if [ $N -gt 0 ]; then expr 1 - $(expr $(expr 1 - $N) / 500); else expr $N / 500; fi

Árbitro. https://en.wikipedia.org/wiki/Floor_and_ceiling_functions


Puedes usar awk

#!/bin/bash number="$1" divisor="$2" ceiling() { awk -vnumber="$number" -vdiv="$divisor" '' function ceiling(x){return x%1 ? int(x)+1 : x} BEGIN{ print ceiling(number/div) }'' } ceiling

salida

$ ./shell.sh 1.234 500 1

O si hay una opción, puede usar un mejor caparazón que tenga coma flotante, por ejemplo, Zsh

integer ceiling_result ceiling_divide() { ceiling_result=$(($1/$2)) echo $((ceiling_result+1)) } ceiling_divide 1.234 500


Una lógica Awk más concisa

awk '' function ceil(ip) { print ip%1 ? int(ip)+1 : ip } BEGIN { ceil(1000/500) ceil(1001/500) } ''

Resultado

2 3


Usando el precioso ''printf'' 1 se redondeará al siguiente entero

printf %.0f $float or printf %.0f `your calculation formula` or printf %.0f $(your calculation formula)

ref: cómo eliminar decimal de una variable?


Floor () { DIVIDEND=${1} DIVISOR=${2} RESULT=$(( ( ${DIVIDEND} - ( ${DIVIDEND} % ${DIVISOR}) )/${DIVISOR} )) echo ${RESULT} } R=$( Floor 8 3 ) echo ${R}

Ceiling () { DIVIDEND=${1} DIVISOR=${2} $(( ( ( ${DIVIDEND} - ( ${DIVIDEND} % ${DIVISOR}) )/${DIVISOR} ) + 1 )) echo ${RESULT} } R=$( Ceiling 8 3 ) echo ${R}