usando til na variável do usuário

0

Eu vi muitas postagens sobre isso na Internet, mas não consegui executá-las como queria.

Eu tenho uma entrada do usuário de um caminho. Se o usuário digitar ~ / Desktop / por exemplo, não posso usar $ ans no grep e outros comandos por causa do til.

aqui está um exemplo do meu código. a segunda linha é o meu principal problema agora.

read -p "Enter new path or type 'exit':   " ans
file='grep -x $ans ~/.Log' 

Aprecie sua ajuda.

    
por erans 13.11.2017 / 20:15

3 respostas

1

Vários problemas aqui:

  1. Você não está citando sua variável. Isto significa que o que quer que o usuário passe será submetido (após a expansão do parâmetro) à divisão de palavras no espaço em branco e à expansão glob. Isso vai quebrar as coisas. Veja:

  2. A entrada do usuário pode começar com um hífen. Em caso afirmativo, ele será interpretado como uma opção para grep . Para evitar isso, use a opção -e para informar a grep que o argumento é especificamente um padrão de pesquisa, não importa o que pareça.

  3. Você está usando a pesquisa de regex. Você provavelmente deseja uma pesquisa de texto fixa, não regex. Então use -F .

  4. Backticks são obsoletos. Use $(...) em vez disso. Veja também:

Colocando esses pontos juntos, você terá um código mais parecido com:

read -p "Enter new path or type 'exit':   " ans
file="$(grep -Fxe "$ans" ~/.Log)"

Mas agora chegamos aos problemas adicionais:

  1. A variável file conterá apenas exatamente o que o usuário digitou, de qualquer forma. Ou possivelmente não conterá nada. Ou possivelmente conterá várias cópias do que o usuário digitou, delimitadas por novas linhas.

    Se omitirmos o -F flag que eu adicionei, a variável file conterá apenas correspondências de linha completa da regex que o usuário digitou.

    Nenhuma dessas coisas são necessariamente arquivos. O fato de você ter chamado a variável file indica que você tem alguma outra expectativa para o que o código faz do que o que realmente faz .

  2. Também há muitos problemas potenciais associados ao uso de read , o que pode não importar para o seu script, mas você deve pelo menos estar ciente deles; veja:

    (Embora essa postagem discuta o uso de um loop shell para processar o texto, o que você não está fazendo, também explica com bons exemplos algumas das peculiaridades envolvidas no uso de read .)

  3. Além disso, o que você está fazendo com essa variável file mais tarde pode ser muito mais simplesmente realizado com um pipeline.

Eu não posso levar isso adiante, porque eu não sei como é o resto do seu roteiro.

    
por 14.11.2017 / 03:51
1

Citar a variável de pesquisa

file='grep -x "$ans" ~/.Log'

    
por 13.11.2017 / 20:50
1

Veja esta questão e as respostas lá. Tem a ver com a ordem e cotação de expansões de shell, especificamente a expansão do til. Para mim, a maneira mais simples é a minha resposta para procurar e substituir ~ pelo valor de $HOME . Então você pode adicionar esta linha antes do seu grep:

ans="${ans//\~/$HOME}"

Isso é um bashismo, mas isso é marcado com bash.

    
por 14.11.2017 / 01:24

Tags