Resultado inesperado ao usar argumentos de linha de comando para procurar arquivo com símbolo

Resultado inesperado ao usar argumentos de linha de comando para procurar arquivo com símbolo

Estou tentando escrever um script que aceite 2 argumentos de linha de comando, por exemplo, um nome de diretório e outro um símbolo (qualquer símbolo pode ser $,£,^,* e assim por diante). Ele deve então verificar se o diretório possui um nome de arquivo com esse símbolo e se não adiciona o símbolo ao diretório.

Portanto, se eu procurasse um diretório chamado testDircomo primeiro argumento e tivesse a *como segundo argumento, ele verificaria se há arquivos nesse diretório para ver se existe esse símbolo em um arquivo e, se não houvesse, o diretório seria chamado agora testDir*.

Aqui está um trecho de código que estou tentando desenvolver.

a1=$1  
  symbol=$(ls $a1 | grep $2)

   if [ "$symbol" != "" ]
     then
     echo "file has Symbol"

   else
     echo "The symbol was added to directory"
     mv $a1 $1$2
    fi

Pareceu funcionar bem com o @símbolo, então acredito que foi afetado pelos caracteres especiais. Existe alguma maneira de tentar escapar de caracteres especiais, mas também trabalhar com caracteres não especiais?

Responder1

Em primeiro lugar, énunca é uma boa ideiapara analisar a saída lsao procurar nomes de arquivos. Isso interromperá qualquer caractere estranho, incluindo um espaço simples. A melhor maneira de contornar isso é usarglobo de conchaou findem vez disso.

Seu próximo problema é que você não está citando as variáveis, o que significa que os caracteres especiais são expandidos antes da mvexecução do comando. Um exemplo funcional do seu script seria:

#!/usr/bin/env bash

if find "$1" -print0 | grep -z "$2" >/dev/null
then
    echo "file has Symbol" 
else
    echo  "The symbol was added to directory" 
    echo mv "$1" "$1$2" 
fi

AVISO: Não tenho ideia de por que você faria isso. Seria. por exemplo, tente mover um diretório para um subdiretório dele mesmo e isso falhará. Suspeito de um problema XY aqui e sugiro que você edite sua pergunta para explicar o que realmente está tentando fazer.

informação relacionada