Como descobrir se o PWD contém espaços ou letras não inglesas?

2

Eu criei uma variável de ambiente:

WD='pwd'

Como posso verificar se contém espaços ou letras diferentes do inglês?

    
por myWallJSON 22.11.2011 / 19:04

5 respostas

3

Eu presumo que por "letras não inglesas" você quer dizer letras que não sejam as 26 letras sem adorno do alfabeto latino. Então, estritamente falando, aqui está um teste que atende aos seus requisitos:

if tmp=${WD//[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]/};
   [[ $tmp = *[[:alpha:] ]* ]]; then
  # $WD contains letters other than A-Z and a-z or a space

Ou seja, tire as letras inglesas e veja se ainda há letras ou espaços.

Suspeito que você esteja realmente tentando evitar todos os caracteres não-ASCII e todos os espaços em branco, incluindo os que não são letras, como ¿ ou £ ou ٣ . Você pode fazer isso combinando os caracteres que não são ! a ~ (ou seja, os caracteres ASCII que não sejam whitespace):

if (LC_ALL=C; [[ $WD = *[^!-~]* ]]) then …

Observe que intervalos como !-~ ou A-Z don ' Sempre faça o que você espera quando tiver LC_COLLATE set. Por isso, definimos LC_ALL como um valor conhecido ( LC_ALL supera todos locale configurações).

Se você estiver verificando caracteres “incomuns” em arquivos (por que mais excluir até espaços, o que é permitido na maioria das plataformas modernas), pode fazer sentido ter uma lista mais restrita que não permita caracteres não portáteis. POSIX só permite letras ASCII, dígitos e -._ .

if (LC_ALL=C; [[ $WD = *[^-._0-9A-Za-z]* ]]) then …
    
por 23.11.2011 / 02:04
1

Expressões regulares e grep é o que você está procurando.

Combinamos qualquer letra ou dígito que não seja em inglês ou / (porque faz parte de todos os caminhos).

if [[ -n "$( pwd | grep -o -P "([^a-zA-Z0-9\/])*" )" ]]; then 
    echo "error"
fi

sed pode ser usado nesse caso também.

Se você pode substituir todos os símbolos corretos em ${WD} por '' e verificar se algo está faltando. Se a string resultante tiver comprimento diferente de zero - ${WD} não está correto.

Então, se estamos esperando apenas / , números e letras inglesas.

if [[ -n "$( pwd | sed -r -e 's/([a-zA-Z0-9\/])*//g' )" ]]; then 
    echo "error"
fi
    
por 22.11.2011 / 20:50
0

tr é um pouco mais simples que grep ou sed nesse caso:

if [[ -n "$(echo $WD|tr -d '[:alnum:]/')" ]];then
  echo "gotcha"
fi
    
por 22.11.2011 / 22:56
0

Parece que o padrão [a-z] não faz distinção entre maiúsculas e minúsculas, por isso é tão simples como:

[ -z "${PWD//[a-z\/]}" ] || echo "Bad chars in path: ${PWD//[a-z\/]}"
    
por 23.11.2011 / 04:03
-1

O Bash pode fazer sua própria correspondência de padrões.

if [[ ${WD} = *[^[:alnum:]/]* ]]; then
  echo 'Baaaad.'
fi
    
por 22.11.2011 / 23:34