7

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

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

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

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

Поэтому любое слово, добавляемое после имени сценария 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

5 ответов5

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 (имя файла: 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
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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .