Как запросить у пользователя имя для создания папки (скрипт bash | shell)? - PullRequest
5 голосов
/ 07 февраля 2012

Во-первых, это мой первый опыт написания сценариев оболочки. У меня есть только опыт работы с HTML и CSS:]

Что я хочу сделать, это настроить простую структуру папок и , чтобы предложить пользователю в диалоговом окне установить имя для корневой папки. Я вызову этот сценарий оболочки через OS X Service или горячую клавишу Keyboard Maestro.

Это то, что я до сих пор придумал:

#!/bin/sh

echo -n "Enter the project name:"
read -e NAME  

mkdir -p ~/Desktop/$NAME
mkdir -p ~/Desktop/$NAME/subfolder1
mkdir -p ~/Desktop/$NAME/subfolder2

Очевидно, что есть какая-то ошибка - переменная не будет передана и корневая папка не будет создана. Я также прочитал, что должен использовать «диалог» для запроса ввода, но я не смог написать что-то, что работает.

Ваша помощь очень ценится. Благодаря.

Ответы [ 5 ]

9 голосов
/ 08 февраля 2012

Команды echo и read работают через текстовый интерфейс, такой как окно «Терминал», в котором выполняется скрипт. Если вы запускаете скрипт в OS X Service, нет терминала-подобного интерфейса, поэтому ниКоманда делает что-нибудь полезное.(Я не знаю о Keyboard Maestro, но предполагаю, что это похоже.) Самый простой способ взаимодействия в подобной ситуации, как правило, заключается в использовании AppleScript с помощью команды osascript:

name="$(osascript -e 'Tell application "System Events" to display dialog "Enter the project name:" default answer ""' -e 'text returned of result' 2>/dev/null)"
if [ $? -ne 0 ]; then
    # The user pressed Cancel
    exit 1 # exit with an error status
elif [ -z "$name" ]; then
    # The user left the project name blank
    osascript -e 'Tell application "System Events" to display alert "You must enter a project name; cancelling..." as warning'
    exit 1 # exit with an error status
fi

mkdir -p ~/Desktop/$name
mkdir -p ~/Desktop/$name/subfolder1
mkdir -p ~/Desktop/$name/subfolder2

(Примечание.: Я предпочитаю использовать имена переменных в нижнем регистре в оболочке, чтобы избежать возможных конфликтов со специальными переменными, такими как PATH и т. Д ...)

3 голосов
/ 05 июня 2012

Примечание: ответ @Gordon Davisson заслуживает похвалы, но вот некоторые улучшения, которые делают код более надежным (я пытался отредактировать исходное сообщение, но оно было отклонено).

Улучшения:

  • начальные и конечные пробелы обрезаются на входе
  • Ввод только пробелов запрещен
  • пустой ввод или ввод через пробел возвращает пользователя для запроса после предупреждения

Код:

while :; do # Loop until valid input is entered or Cancel is pressed.
    name=$(osascript -e 'Tell application "System Events" to display dialog "Enter the project name:" default answer ""' -e 'text returned of result' 2>/dev/null)
    if (( $? )); then exit 1; fi  # Abort, if user pressed Cancel.
    name=$(echo -n "$name" | sed 's/^ *//' | sed 's/ *$//')  # Trim leading and trailing whitespace.
    if [[ -z "$name" ]]; then
        # The user left the project name blank.
        osascript -e 'Tell application "System Events" to display alert "You must enter a non-blank project name; please try again." as warning' >/dev/null
        # Continue loop to prompt again.
    else
        # Valid input: exit loop and continue.
        break
    fi
done
2 голосов
/ 07 февраля 2012

Я предполагаю, что скрипт не запускается в интерактивной оболочке, что означает, что вы не сможете взаимодействовать с read -e.

У меня нет окна OSX, чтобы попробовать это, но вы можете попробовать использовать CocoaDialog для графического диалогового окна.

Непроверенный пример:

#!/bin/bash
NAME=`CocoaDialog standard-inputbox --title "Project Name" --no-newline --no-cancel --informative-text "Enter the project name"`
mkdir -p ~/Desktop/$NAME/subfolder1
mkdir -p ~/Desktop/$NAME/subfolder2
1 голос
/ 07 февраля 2012

Попробуйте изменить строку Шебанга на #!/bin/bash. read является встроенным bash, и вы не запускаете свой скрипт с bash в настоящее время. /bin/sh на самом деле может быть ссылкой на /bin/bash, но согласно Википедии это зависит от конкретной версии OS X, которая у вас есть.

Ваш скрипт должен работать корректно в bash.

0 голосов
/ 07 февраля 2012

NAME пусто или просто выводит $ NAME в виде строки?Если это последнее, вам следует попробовать ~ / Desktop / $ (NAME)

Кроме того, вам следует попробовать XDialog (или любой другой инструмент в MacOS). Существует множество ресурсов по использованиюэто для обработки ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...