bash script: verifica se uma variável está em [A-Z] [fechada]

6

Como posso verificar se uma variável está em [A-Z]?

Eu quero alcançar algo assim:

read var

while [ $var in [A-Z] ]
do
 #code here
done

Como faço para isso?

    
por xmpirate 26.09.2013 / 09:48

5 respostas

9

No bash, você pode usar um padrão no lado direito de um == em um [[ ... ]] :

read var
LC_ALL=C # Turn off locale.
if [[ $var == [A-Z] ]] ; then
    echo yes
fi

A desativação da localidade pode ser necessária se você não quiser que y esteja em A-Z .

    
por 26.09.2013 / 09:53
6

O simples one liner seria:

re='[a-zA-Z]'; if [[ Z =~ $re ]]; then echo "Match"; else echo "No match"; fi

O script completo seria:

#!/bin/bash

re='[a-zA-Z]'
read -p "Enter a char or string > " var

if [[ "$var" =~ $re ]]; then
    echo "Entered string matches."
else 
    echo "Entered string does not match";
fi
    
por 26.09.2013 / 11:41
5

Assumindo que $var seja um único caractere:

Eu usei case , então seria portável para qualquer sh shell:

case "$var" in [A-Z]) thing_to_do_here ;;

ou até mesmo

case "$var" in [[:upper:]]) thing_to_do_here ;; esac

Para aqueles de vocês que não gostam de parênteses desequilibrados: não há problema em escrever

case "$var" in ([[:upper:]]) thing_to_do_here ;; esac
    
por 01.08.2016 / 08:42
0

Se você não quer confiar nas expressões regulares do Bash:

remainder=$(tr -d A-Z <<<$var)
while [ ! -z $remainder ];do
    read -p "Invalid value entered. Please try again." var
    remainder=$(tr -d A-Z <<<$var)
done

Suponho que você queira usar isso para validação de entrada.

    
por 26.09.2013 / 14:13
0

Está um pouco atrasado, mas você pode usar grep e fazer algo assim:

read var
if grep -q "[a-z]" <<< "$var"
then
    <code>
fi
    
por 01.08.2016 / 08:34