Estoy intentando escribir un script que acepte 2 argumentos de línea de comando, por ejemplo, uno con el nombre de un directorio y el otro con un símbolo (cualquier símbolo puede ser $,£,^,*, etc.). Luego debería verificar si el directorio tiene un nombre de archivo que tenga ese símbolo y si no agrega el símbolo al directorio.
Entonces, si buscara un directorio llamado testDir
como primer argumento y tuviera *
como segundo argumento, buscaría archivos en ese directorio para ver si hay ese símbolo en un archivo y, si no lo hubiera, ahora se llamaría al directorio testDir*
.
Aquí hay un fragmento de código que estoy intentando desarrollar.
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
Parecía funcionar bien con el @
símbolo, así que creo que ha sido afectado por los caracteres especiales. ¿Hay alguna forma de intentar escapar de caracteres especiales pero también trabajar con caracteres no especiales?
Respuesta1
En primer lugar, esnunca es una buena ideapara analizar la salida ls
cuando se buscan nombres de archivos. Eso se romperá con cualquier carácter extraño, incluido un espacio simple. La mejor manera de evitarlo es utilizarglobo de conchao find
en su lugar.
Su siguiente problema es que no está citando las variables, lo que significa que los caracteres especiales se expanden antes de mv
ejecutar el comando. Un ejemplo práctico de su script sería:
#!/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
ADVERTENCIA: No tengo idea de por qué querrías hacer eso. Sería. por ejemplo, intente mover un directorio a un subdirectorio propio y fallará. Sospecho que hay un problema XY aquí y le sugiero que edite su pregunta para explicar lo que realmente está tratando de hacer.