Obtenha o script para ser executado novamente se a entrada for sim

5

Estou montando um script de manipulação de arquivos simples, tudo funcionando bem, exceto no final. Quero que ele diga do you want to perform another action e, se a resposta for yes , quero que o script seja iniciado novamente. Eu sei que preciso de algum tipo de loop aqui? Aqui está o que eu tenho:

#/bin/bash


echo "Select an option from copy , remove , rename , linking"
#read in user input into the action variable

read action

# if action is copy then continue proceed with the following
if [ $action = "copy" ]
then
echo "Please enter the filename you wish to copy"
read filename
# check if filename exists, if it doesn't then exit program
    if [ ! -e  $filename ] 
    then
    echo "$filename does not exist"
    exit 1
    fi
echo "Please enter the new filename"
read filenamenew
cp $filename $filenamenew
echo "$filename has been copied to $filenamenew"

# if action is remove then continue proceed with the following
elif [ $action = "remove" ]
then
echo "Please enter the filename you wish to remove"
read filename
# check if filename exists, if it doesn't then exit program
    if [ ! -e  $filename ] 
    then
    echo "$filename does not exist"
    exit 1
    fi
rm -rf $filename
echo "$filename has been deleted"

# if action is rename then continue proceed with the following
elif [ $action = "rename" ]
then
echo "Please enter the filename you wish to rename"
read filename
# check if filename exists, if it doesn't then exit program
    if [ ! -e  $filename ] 
    then
    echo "$filename does not exist"
    exit 1
    fi
echo "Please enter the new filename"
read filenamenew
mv $filename $filenamenew
echo "$filename has been renamed to $filenamenew"
fi

echo "Do you want to perform another file operation (yes/no) ?"
read answer

if [ $answer = yes ]
then "run script again"
exit 0
    elif [ $answer = no ]
    then echo "Exiting Program"
    exit 0
    fi
fi
    
por johndoe12345 29.09.2015 / 15:17

3 respostas

8

antes do eco "Selecione uma ação ..."

answer=yes
while [ "$answer" = yes ]
do

no final, substitua

if [ $answer = yes ]
then "run script again"
exit 0
    elif [ $answer = no ]
    then echo "Exiting Program"
    exit 0
    fi
fi

por

if [ "$answer" = yes ]
then "run script again"
fi

done

echo "Exiting Program"
exit 0

o que eu fiz, é anexar programm em while [$condition ] do ; ... done .

Eu apenas assegurei que a condição estava OK ( answer=yes ) no primeiro loop.

    
por 29.09.2015 / 15:30
6

As respostas sobre o loop são boas maneiras de lidar com isso. Mas, para referência, não há nada de errado em fazer com que o script seja invocado novamente, portanto, /usr/local/bin/myscript poderia ler:

#!/bin/sh
...
if [ yes = "$answer" ]; then
  /usr/local/bin/myscript
fi

Você não precisa de um exit 0 no outro caso porque isso acontecerá automaticamente. Além disso, se você souber que está no mesmo diretório de trabalho no final do script como estava no início, poderá evitar codificar o caminho do script usando apenas $0 .

Há um último refinamento que é importante. Conforme escrito, o processo de script iniciado inicialmente gerará um segundo e aguardará a conclusão; o segundo pode então gerar um terceiro e esperar que ele termine; e assim por diante. Isso consome recursos e realmente não há trabalho para esses scripts fazerem quando sua descendência sair. Então você faria melhor para executá-los usando o equivalente a um "tail-call" na programação. Isso é feito usando o comando exec :

#!/bin/sh
...
if [ yes = "$answer" ]; then
  exec /usr/local/bin/myscript # or exec $0
fi

Isso funciona exatamente como antes, exceto que o primeiro processo sai quando começa o segundo, e quando o segundo termina, se ele não gerou um terceiro processo, voltamos diretamente para quem iniciou o primeiro processo, presumivelmente o concha.

    
por 29.09.2015 / 15:45
1

Tente envolver seu script como uma função e chamá-lo recursivamente:

#/bin/bash
do_file_action(){
  echo "Select an option from copy , remove , rename , linking"
  #read in user input into the action variable

  read action

  ...

  echo "Do you want to perform another file operation (yes/no) ?"
  read answer

  if [ $answer = yes ]
  then do_file_action
  exit 0
      elif [ $answer = no ]
      then echo "Exiting Program"
      exit 0
      fi
  fi
}

do_file_action
    
por 29.09.2015 / 15:36