Как сделать так, чтобы Bash Script принимал входные данные до его запуска?


7

По сути, вы вызываете мой Bash Script, набирая mybashscriptв консоли. Тогда это начинается:

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

Затем пользователь вводит любой желаемый ввод, который затем активирует скрипт Python ниже в соответствующем дереве каждого параметра.

Что мне интересно, так это как сделать так, чтобы пользователю нужно было всего лишь напечатать (если они уже использовали программу) что-то вроде mybashscript loginили mybashscript view.

Поэтому любое слово, добавляемое после имени сценария Bash, затем принимается в качестве первого ввода в самом сценарии. Это возможно?

Вот мой сценарий, я не совсем понимаю, как включить $ 1, не давая ему спросить, нет ли аргумента.

#!/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

1
Аргументы: $ 0 для имени программы, $ 1, $ 2… для других аргументов, $ # для количества аргументов, $ * для всех аргументов от 1, $ @ как $ *, но если в кавычках аргументы хранятся отдельно. Также команда shiftудалит $ 1 и сдвинет остальные вниз, $ 2 станет $ 1, $ 3 станет $ 2…
ctrl-alt-delor

Ответы:


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

Большое спасибо, не могли бы вы просто взглянуть на мои изменения? Я не совсем уверен, как это сделать для моей ситуации.
пользователь

ответ обновлен.
Уве

4

В вашем bash-скрипте $1это первый аргумент, $2второй аргумент и так далее.

например, если у вас есть следующее в test.sh:

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

Тогда вы получите следующее:

user@host:~$ test.sh hello
You said "hello"

спасибо за помощь, не могли бы вы взглянуть на мое редактирование?
пользователь

1

Чтобы получить ввод из командной строки и передать его вашей программе, используйте $ 1 (для первого слова после команды), $ 2, $ 3 и так далее.

Например, предположим, что вы написали этот Bash Script (имя файла: testscript):

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

Это будет вывод, когда скрипт вызывается пользователем из консоли (не забудьте добавить разрешения x, чтобы скрипт мог выполняться оболочкой и поместил скрипт в / usr / local / bin /):

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

Спасибо за вашу помощь, это подтолкнуло меня в правильном направлении. Вот что я в итоге сделал для моего конкретного случая, если вам было любопытно; это может быть не самый лучший или самый элегантный способ использования Bash Script, но я только начал сегодня!

#!/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

По мере знакомства с bash обратите внимание на замену цепочки if оператором case. Это имеет тенденцию быть чище и более читаемым / ремонтопригодным. В зависимости от вашего стиля кодирования вы также можете использовать select: select name [in word]; сделать список; сделано, что делает примитивное меню для вас.
Джо

0

Как я понимаю, вам нужно получить аргументы командной строки.

Возьмите пример ниже:

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

$1 представляет первый аргумент командной строки, который передается в вашу программу.

Если мы вызовем сценарий выше (давайте используем имя, которое у вас было в вашем вопросе mybashscript) с loginаргументом

$ mybashscript login

Мы получаем вывод ниже:

Welcome to mybashscript!
Selected option: login

Если больше аргументов заданы, вы можете получить к ним доступ , используя $2, $3..., и так далее. Но это полезно только тогда, когда у вас есть фиксированное количество аргументов. Если вы хотите использовать переменное количество аргументов, проверьте этот пост в StackOverflow.


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

Тестирование кода:

$ ./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

Объяснение:

[[ "$1" =~ ^(sign|view|save|erase)$ ]];проверяет ввод с использованием регулярных выражений для более краткого кода, а не для if-elseрендеринга. $1Относится к первому позиционного аргумента , что эта функция приема, а не сам скрипт. Проверка [ -n "$1" ]заключается в том, чтобы печатать Sorryоператор, только если введен какой-либо ввод.

launch "$1" && exitпопытка проверить любой ввод через $1, если это успешно, скрипт завершится.

Предположения:

  1. Сценарий Python завершит работу с успешным состоянием, как это if launch "$option"; then ...будет работать. Если это предположение неверно и проверка состояния выхода не улучшена, мы застрянем в цикле.
  2. Мы можем использовать $1для запуска правильный сценарий в пути ${1}_guestbook.py.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.