in

¿Cómo convertir una cadena a minúsculas en Bash?

apple touch icon@2

Muchas respuestas usando programas externos, lo que realmente no está usando Bash.

Si sabe que tendrá Bash4 disponible, debería usar el ${VAR,,} notación (es fácil y genial). Para Bash antes de 4 (Mi Mac todavía usa Bash 3.2, por ejemplo). Usé la versión corregida de la respuesta de @ ghostdog74 para crear una versión más portátil.

Uno al que puedes llamar lowercase 'my STRING' y obtén una versión en minúsculas. Leí comentarios sobre cómo configurar el resultado en una var, pero eso no es realmente portátil en Bash, ya que no podemos devolver cadenas. Imprimirlo es la mejor solución. Fácil de capturar con algo como var="$(lowercase $str)".

Como funciona esto

La forma en que esto funciona es obteniendo la representación entera ASCII de cada carácter con printf y luego adding 32 si upper-to->lower, o subtracting 32 si lower-to->upper. Entonces usa printf de nuevo para convertir el número de nuevo a un carácter. De 'A' -to-> 'a' tenemos una diferencia de 32 caracteres.

Utilizando printf para explicar:

$ printf "%dn" "'a"
97
$ printf "%dn" "'A"
65

97 - 65 = 32

Y esta es la versión de trabajo con ejemplos.
Tenga en cuenta los comentarios en el código, ya que explican muchas cosas:

#!/bin/bash

# lowerupper.sh

# Prints the lowercase version of a char
lowercaseChar(){
    case "$1" in
        [A-Z])
            n=$(printf "%d" "'$1")
            n=$((n+32))
            printf \$(printf "%o" "$n")
            ;;
        *)
            printf "%s" "$1"
            ;;
    esac
}

# Prints the lowercase version of a sequence of strings
lowercase() {
    word="$@"
    for((i=0;i<${#word};i++)); do
        ch="${word:$i:1}"
        lowercaseChar "$ch"
    done
}

# Prints the uppercase version of a char
uppercaseChar(){
    case "$1" in
        [a-z])
            n=$(printf "%d" "'$1")
            n=$((n-32))
            printf \$(printf "%o" "$n")
            ;;
        *)
            printf "%s" "$1"
            ;;
    esac
}

# Prints the uppercase version of a sequence of strings
uppercase() {
    word="$@"
    for((i=0;i<${#word};i++)); do
        ch="${word:$i:1}"
        uppercaseChar "$ch"
    done
}

# The functions will not add a new line, so use echo or
# append it if you want a new line after printing

# Printing stuff directly
lowercase "I AM the Walrus!"$'n'
uppercase "I AM the Walrus!"$'n'

echo "----------"

# Printing a var
str="A StRing WITH mixed sTUFF!"
lowercase "$str"$'n'
uppercase "$str"$'n'

echo "----------"

# Not quoting the var should also work, 
# since we use "$@" inside the functions
lowercase $str$'n'
uppercase $str$'n'

echo "----------"

# Assigning to a var
myLowerVar="$(lowercase $str)"
myUpperVar="$(uppercase $str)"
echo "myLowerVar: $myLowerVar"
echo "myUpperVar: $myUpperVar"

echo "----------"

# You can even do stuff like
if [[ 'option 2' = "$(lowercase 'OPTION 2')" ]]; then
    echo "Fine! All the same!"
else
    echo "Ops! Not the same!"
fi

exit 0

Y los resultados después de ejecutar esto:

$ ./lowerupper.sh 
i am the walrus!
I AM THE WALRUS!
----------
a string with mixed stuff!
A STRING WITH MIXED STUFF!
----------
a string with mixed stuff!
A STRING WITH MIXED STUFF!
----------
myLowerVar: a string with mixed stuff!
myUpperVar: A STRING WITH MIXED STUFF!
----------
Fine! All the same!

Sin embargo, esto solo debería funcionar para caracteres ASCII.

Para mí está bien, ya que sé que solo le pasaré caracteres ASCII.
Estoy usando esto para algunas opciones de CLI que no distinguen entre mayúsculas y minúsculas, por ejemplo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

MongoDB – Documento de actualización

kzG7qEtZiU67FgzthKUbbE 1200 80

Desafíos de la semana 7 de Fortnite: cómo terminar todas las tareas semanales en la semana 7 de la temporada 4