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 testDir
como 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 ls
ao procurar nomes de arquivos. Isso interromperá qualquer caractere estranho, incluindo um espaço simples. A melhor maneira de contornar isso é usarglobo de conchaou find
em 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 mv
execuçã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.