
Estoy intentando escribir un script que requiera la interacción del usuario. Básicamente, el script tiene que preguntar al usuario acerca de 3 parámetros: nombre del archivo que el usuario desea encontrar, el número de días durante los cuales se modificaron los archivos y el nombre del archivo tar. Cuando se conocen todos los parámetros, el script debe encontrar los archivos apropiados y convertirlos en un archivo con un nombre determinado. Cuando escribo un solo comando en la terminal:
find -name 'zad*' -mtime -10 | tar -cvf archive.tar.gz -T -
funciona bien. ¿Cómo puedo utilizar una variable ingresada por un usuario para invocar el comando que está en el mismo script? Mi script está creando un archivo vacío.
Mi guión:
echo "Enter a number of days"
read days
echo "Enter the name of file"
read nameoffile
echo "Enter the name of tar archive"
read nameofarchive
find -name '"$nameoffile"' -mtime -"$days" | tar -cvf "$nameofarchive".tar.gz -T -
Respuesta1
Intente eliminar las '
comillas adicionales en'"$nameoffile"'
Ejemplo:
maulinglawns@debian-HP:~$ read nameoffile
myFile
maulinglawns@debian-HP:~$ echo '"$nameoffile"'
"$nameoffile"
maulinglawns@debian-HP:~$ echo "$nameoffile"
myFile
Si necesita comillas simples, escápelas así:
echo \'$nameoffile\'
'myFile'
Respuesta2
En general, necesitar la interacción del usuario es una muy mala idea. hace que su secuencia de comandos sea imposible de automatizar y hace que sea muy difícil de usar para sus usuarios, ya que necesitan escribir cosas manualmente en un entorno que no permite completar con pestañas.
Desde @maulinglawnsya explicadoPor qué fallaba su script, le daré una forma más sencilla de hacerlo que no requiere que sus usuarios escriban información laboriosamente:
#!/usr/bin/env sh
days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -
Luego, para buscar archivos con el nombre foo.txt
, modificados en los últimos 3 días y archivarlos en bar.tar.gz`, ejecutaría:
script.sh 3 foo.txt bar
También puede agregar una simple verificación de errores para garantizar que el script siempre se ejecute con la cantidad correcta de parámetros:
#!/usr/bin/env sh
if [ $# -ne 3 ]; then
echo "You need to enter three arguments"
exit 1
fi
days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -
Respuesta3
read admite nombres de variables, por ejemplo;
#!/bin/bash
read -p "How many files? (0-100) " VAR_NUMBER_OF_FILES
read -p "How many days? (0-100) " VAR_NUMBER_OF_DAYS
read -p "Tar file name? " VAR_TAR_NAME
...
find -name '"$VAR_NUMBER_OF_FILES"' -mtime -"$VAR_NUMBER_OF_DAYS" | tar -cvf "$VAR_TAR_NAME".tar.gz -T -