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)
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}