
Estou tentando escrever um script que requer interação do usuário. Basicamente, o script deve perguntar ao usuário cerca de 3 parâmetros: nome do(s) arquivo(s) que o usuário deseja encontrar, o número de dias durante os quais o(s) arquivo(s) foram modificados e o nome de um arquivo tar. Quando todos os parâmetros forem conhecidos, o script deve encontrar os arquivos apropriados e transformá-los em um arquivo com um determinado nome. Quando escrevo um único comando no terminal:
find -name 'zad*' -mtime -10 | tar -cvf archive.tar.gz -T -
funciona bem. Como posso usar uma variável inserida por um usuário para invocar o comando que está no mesmo script? Meu script está criando um arquivo vazio.
Meu roteiro:
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 -
Responder1
Tente remover as '
aspas extras em'"$nameoffile"'
Exemplo:
maulinglawns@debian-HP:~$ read nameoffile
myFile
maulinglawns@debian-HP:~$ echo '"$nameoffile"'
"$nameoffile"
maulinglawns@debian-HP:~$ echo "$nameoffile"
myFile
Se você precisar de aspas simples, escape-as assim:
echo \'$nameoffile\'
'myFile'
Responder2
Em geral, precisar da interação do usuário é uma péssima ideia. isso torna seu script impossível de automatizar e torna muito difícil o uso dos usuários, pois eles precisam digitar as coisas manualmente em um ambiente que não permite o preenchimento de guias.
Desde @maulinglawnsjá explicadopor que seu script estava falhando, darei a você uma maneira mais simples de fazer isso, que não exige que seus usuários digitem informações laboriosamente:
#!/usr/bin/env sh
days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -
Então, para encontrar arquivos nomeados foo.txt
, modificados nos últimos 3 dias e arquivá-los em bar.tar.gz`, você executaria:
script.sh 3 foo.txt bar
Você também pode adicionar uma verificação simples de erros para garantir que o script seja sempre executado com o número correto 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 -
Responder3
read suporta nomear variáveis, por exemplo;
#!/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 -