Como posso fazer um script Bash tomar uma entrada antes que o script seja invocado?

7

Basicamente, você chama meu script Bash digitando mybashscript no console. Então isso começa:

Welcome to mybashcript! Choose an option (login|logout|view|erase|quit|):

O usuário, então, digita qualquer entrada que queira, que então ativa um Script Python mais abaixo na árvore de cada opção, se for.

O que eu estou querendo saber é, como posso fazer com que o usuário só precise digitar (se eles usaram o programa antes) algo como mybashscript login ou mybashscript view .

Assim, qualquer palavra adicionada após o nome do script Bash é tomada como a primeira entrada no próprio script. Isso é possível?

Aqui está meu script até agora, eu não entendo exatamente como incorporar $ 1 sem deixar que ele pergunte se não há um argumento.

#!/bin/bash

echo -n "Hello $USER, welcome to the guestbook! Choose an option (sign|view|save|erase):     "

read option

if [ "$option" == "sign" ]; then
  python /usr/local/bin/guestbook.data/sign_guestbook.py

 elif [ "$option" == "view" ]; then
  python /usr/local/bin/guestbook.data/view_guestbook.py

 elif [ "$option" == "save" ]; then
  python /usr/local/bin/guestbook.data/save_guestbook.py

 elif [ "$option" == "erase" ]; then
  python /usr/local/bin/guestbook.data/erase_guestbook.py

 else
  echo "Sorry, I didn't understand that." 

fi
    
por user 18.08.2013 / 17:04

5 respostas

14

#!/bin/bash

case $# in
0) echo -n "Hello $USER, welcome to the guestbook! Choose an option (sign|view|save|erase):     "
   read option ;;

1) option=$1 ;;

*) echo "Sorry, I didn't understand that (too many command line arguments)"
   exit 2 ;;

esac

if [ "$option" == "sign" ]; then
  python /usr/local/bin/guestbook.data/sign_guestbook.py

elif [ "$option" == "view" ]; then
  python /usr/local/bin/guestbook.data/view_guestbook.py

elif [ "$option" == "save" ]; then
  python /usr/local/bin/guestbook.data/save_guestbook.py

elif [ "$option" == "erase" ]; then
  python /usr/local/bin/guestbook.data/erase_guestbook.py

else
  echo "Sorry, I didn't understand that." 

fi
    
por 18.08.2013 / 17:20
4

No seu script bash $1 é o primeiro argumento, $2 é o segundo argumento e assim por diante.

por exemplo. se você tem o seguinte em test.sh :

#!/bin/sh
echo You said \"$1\"

Então você receberá o seguinte:

user@host:~$ test.sh hello
You said "hello"
    
por 18.08.2013 / 17:18
1

A maneira de receber a entrada da linha de comando e passá-la para o seu programa é usando $ 1 (para a primeira palavra após o comando), $ 2, $ 3 e assim por diante.

Por exemplo, digamos que você tenha escrito este script Bash (nome do arquivo: testscript):

#!/bin/bash
echo $1
echo $2
echo $5

Esta seria a saída quando o script é chamado por um usuário do console (lembre-se de adicionar x permissões para que o script possa ser executado pelo shell e colocar o script em / usr / local / bin /):

user:$ testscript how are you doing today?
how
are
today?

Obrigado por toda sua ajuda, isso me empurrou na direção certa. Aqui está o que acabei fazendo para o meu caso específico, se você estivesse curioso; pode não ser a melhor e mais elegante maneira de Bash Script, mas eu comecei hoje!:

#!/bin/bash

if [ "$1" == "sign" ]; then
  python /usr/local/bin/guestbook.data/sign_guestbook.py

elif [ "$1" == "view" ]; then
  python /usr/local/bin/guestbook.data/view_guestbook.py

elif [ "$1" == "save" ]; then
  python /usr/local/bin/guestbook.data/save_guestbook.py

elif [ "$1" == "erase" ]; then
  python /usr/local/bin/guestbook.data/erase_guestbook.py

else
  echo -n "Hello $USER, welcome to the guestbook! Choose an option (sign|view|save|erase): "

  read option

    if [ "$option" == "sign" ]; then
      python /usr/local/bin/guestbook.data/sign_guestbook.py

    elif [ "$option" == "view" ]; then
      python /usr/local/bin/guestbook.data/view_guestbook.py

    elif [ "$option" == "save" ]; then
      python /usr/local/bin/guestbook.data/save_guestbook.py

    elif [ "$option" == "erase" ]; then
      python /usr/local/bin/guestbook.data/erase_guestbook.py

    else
      echo "Sorry, I didn't understand that." 

    fi

fi
    
por 18.08.2013 / 18:43
0

Pelo que entendi, o que você quer é obter argumentos de linha de comando.

Veja o exemplo abaixo:

#! /bin/bash
echo "Welcome to mybashcript!"
echo "Selected option: $1"

$1 representa o primeiro argumento de linha de comando que é passado para o seu programa.

Se chamarmos o script acima (vamos usar o nome que você tinha na sua pergunta, mybashscript ) com login como argumento

$ mybashscript login

Obtemos a saída abaixo:

Welcome to mybashscript!
Selected option: login

Se mais argumentos forem fornecidos, você poderá acessá-los usando $2 , $3 , ... e assim por diante. Mas isso só é útil quando você tem um número fixo de argumentos. Se você quiser usar um número variável de argumentos, verifique este post no StackOverflow.

    
por 18.08.2013 / 17:33
0
$ cat test.sh
#!/bin/bash
launch() {
    if [[ "$1" =~ ^(sign|view|save|erase)$ ]]; then
        echo python /usr/local/bin/guestbook.data/${1}_guestbook.py
    else
        [ -n "$1" ] && echo "Sorry, I didn't understand that."
        return 1
    fi
}
show_help() {
        echo -n "Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): "
}
launch "$1" && exit
show_help
while read option; do
        if launch "$option"; then
                break
        else
                show_help
        fi
done

Testando o código:

$ ./test.sh
Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): a
Sorry, I didn't understand that.
Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): sign
python /usr/local/bin/guestbook.data/sign_guestbook.py
$ ./test.sh
Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): asign
Sorry, I didn't understand that.
Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): view
python /usr/local/bin/guestbook.data/view_guestbook.py
$ ./test.sh a
Sorry, I didn't understand that.
Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): save
python /usr/local/bin/guestbook.data/save_guestbook.py
$ ./test.sh erase
python /usr/local/bin/guestbook.data/erase_guestbook.py

Explicação:

[[ "$1" =~ ^(sign|view|save|erase)$ ]]; testa a entrada usando expressões regulares para um código mais conciso, em vez de uma if-else ladder. O $1 refere-se ao primeiro argumento posicional que essa função recebe, não o script em si. O teste para [ -n "$1" ] é apenas para imprimir a declaração Sorry se houver alguma entrada digitada.

launch "$1" && exit tenta verificar qualquer entrada via $1 , se tiver êxito, o script sairá.

Suposições:

  1. O script python sairá com um status bem-sucedido, que é como if launch "$option"; then ... funcionará. Se essa suposição for falsa e a verificação da condição de saída não for melhorada, ficaremos presos em um loop.
  2. Podemos usar $1 para iniciar o script correto na forma ${1}_guestbook.py .
por 19.08.2013 / 05:34

Tags