如何提示用户输入名称来创建文件夹(bash | shell脚本)?

时间:2012-02-07 17:00:55

标签: macos bash shell directory-structure

首先,这是我第一次使用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

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

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

5 个答案:

答案 0 :(得分:9)

echoread命令都通过文本界面工作,例如运行脚本的终端窗口。如果在OS X服务中运行脚本,则没有类似终端的接口,所以这两个命令都没有用。 (我不知道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等)发生冲突...)

答案 1 :(得分:3)

注意:@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 :(得分:2)

我假设脚本没有在交互式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

答案 3 :(得分:1)

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

你的脚本应该在bash下正常工作。

答案 4 :(得分:0)

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

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