【问题标题】:How to prompt a user for a name to create a folder (bash | shell script)?如何提示用户输入名称以创建文件夹(bash | shell 脚本)?
【发布时间】:2012-02-07 17:00:55
【问题描述】:

首先,这是我第一次接触 shell 脚本。我只有 HTML 和 CSS 方面的经验:]

我要做的是设置一个简单的文件夹结构在对话框中提示用户设置名称 用于根文件夹。我将通过 OS X 服务或 Keyboard Maestro 热键触发这个 shell 脚本。

这是我目前想出的:

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

显然有一些错误 - 变量不会被传递并且根文件夹没有被创建。我还读到我应该使用“对话”来询问输入,但我无法编写有效的东西。

非常感谢您的帮助。谢谢。

【问题讨论】:

    标签: macos bash shell directory-structure


    【解决方案1】:

    echoread 命令都通过文本界面工作,例如运行脚本的终端窗口。如果您在 OS X 服务中运行脚本,则没有类似终端的界面,因此两者都没有command 做任何有用的事情。 (我不知道 Keyboard Maestro,但我认为它是相似的。)在这种情况下进行交互的最简单方法通常是通过 osascript 命令使用 AppleScript:

    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
    

    (注意:我更喜欢在 shell 中使用小写变量名,以避免可能与 PATH 等特殊变量发生冲突...)

    【讨论】:

    • 太棒了,我知道有一种更聪明的方法可以做到这一点。感谢您提供 osascript 提示和上面的示例!
    • 对不起,你能告诉我这个命令中的“fi”是什么意思吗?
    • @nullmicgo: fi 标志着if 块的结束——它是“if”的倒写,类似于case ... esac 块。
    • 这可以用来生成一个没有“取消”按钮的输入对话框吗? 编辑:是的,你可以。我在这个有用的reference doc 中找到了答案。
    • @RicardoSánchez-Sáez:为了记录,将default answer ""'更改为default answer "" buttons {"OK"} default button "OK"'
    【解决方案2】:

    注意:@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
    

    【讨论】:

      【解决方案3】:

      我假设脚本没有在交互式 shell 中运行,这意味着您将无法与 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
      

      【讨论】:

      • 感谢 CocoaDialog 的建议,并确认我离开 shell 时无法进行交互。我仍然更喜欢使用板载工具而不是安装另一个应用程序(编码新手说话)。
      【解决方案4】:

      尝试将 shebang 行更改为 #!/bin/bashread 是内置的 bash,您目前没有使用 bash 运行脚本。 /bin/sh 实际上可能是指向/bin/bash 的链接,但根据维基百科,这取决于您拥有的 OS X 的特定版本。

      您的脚本应该可以在 bash 下正常运行。

      【讨论】:

      • 它不起作用 - 再次只创建了两个子文件夹。我想我没有收到提示是因为我没有在 shell 中触发它。
      • 我没有意识到它是这样工作的,我以为你是在终端中生成进程。很抱歉!
      • 没问题。我应该更准确,感谢您尝试提供帮助。
      【解决方案5】:

      NAME 是空的还是只是将 $NAME 作为字符串输出?如果是后者,您应该尝试 ~/Desktop/$(NAME)

      此外,您应该尝试XDialog(或任何 MacOS 中的工具。)有很多关于使用它进行输入处理的资源。

      【讨论】:

        猜你喜欢
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多