Como criar um script bash que chame outros scripts dependendo da linha de comando swith

2

Sou extremamente novo no bash e preciso criar um script que chame outro script, dependendo da chave de linha de comando usada.

Vamos chamá-lo de stuff.sh

que stuff.sh --help deve se comportar como a ajuda em um programa normal e dar uma lista ao usuário do que ele pode fazer

  • -Você pode fazer coisas assim.
  • -b você pode fazer coisas assim.
  • -c isso é algo extremamente chique.

Quando executo o script com stuff.sh - a , ele deve fazer alguma coisa, digamos, chamar outro script com sudo na frente dele.

Como eu poderia fazer isso?

alguma idéia que todo mundo que é novo para o bash pode entender facilmente?

Obrigado!

    
por Josh 22.06.2013 / 11:51

2 respostas

5
#!/bin/bash

function show_help() {
    cat << ENDHELP
-a you can do stuff like that.
-b you can do stuff like that.
-c this is extremely fancy stuff.
ENDHELP
}

case $1 in
    --help)
        show_help
    ;;
    -a)
        sudo /path/to/other/script
    ;;
    -b)
        do_some_stuff
        do_another_stuff
    ;;
    -c)
        do_extremely_fancy_stuff
        do_another_extremely_fancy_stuff
        run_as_many_commands_as_you_want
    ;;
    *)
        echo "Run $0 --help"
    ;;
esac
  • $0 é o nome do script.
  • $1 é o primeiro argumento de linha de comando, $2 é o segundo e assim por diante.

Leia o manpage para referência.

    
por Eric Carvalho 22.06.2013 / 12:14
1

Se você estiver satisfeito com -h em vez de --help , também poderá usar getopts , o que é muito conveniente. O código que você precisaria então (modificado da resposta de Eric Carvalho):

#!/bin/bash

function show_help() {
    cat << ENDHELP
-a you can do stuff like that.
-b you can do stuff like this.
-c this is extremely fancy stuff.
ENDHELP
}

#checks if there are any arguments by (ab)using the short-circuited OR
(( $# )) || echo "No arguments. Run $0 --help"

while getopts 'habc' opt; do
        case "$opt" in
            h)
                show_help
            ;;
            a)
                echo "sudo /path/to/other/script"
            ;;
            b)
                echo "do_some_stuff"
                echo "do_another_stuff"
            ;;
            c)
                echo "do_extremely_fancy_stuff"
                echo "do_another_extremely_fancy_stuff"
                echo "run_as_many_commands_as_you_want"
            ;;
            *)
                echo "Run $0 --help"
            ;;
        esac
done

Agora você pode passar várias opções para o seu shellscript, então se você quiser executar a, bec você pode fazer

./script.bash -a -b -c

ou até mesmo

./script.bash -abc

A string 'habc' da opção informa quais opções são permitidas, getopts informará automaticamente sobre as opções não suportadas. Você também pode adicionar argumentos às opções (como o nome dos outros scripts que deseja executar), então você precisa adicionar dois pontos ( : ) atrás de sua opção, o argumento é então armazenado em $OPTARG . Veja esta (incompleta) página wiki sobre como fazer isso.

PS Você também pode usar (o mais antigo) getopt (sem s ), getopt é um pouco mais difícil, mas permite usar --help .

    
por Gerhard Burger 22.06.2013 / 16:19