首先,这是我第一次使用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
显然存在一些错误 - 该变量不会被传递,并且不会创建根文件夹。我还读到我应该使用“对话框”来询问输入,但我无法写出有用的东西。
非常感谢您的帮助。感谢。
答案 0 :(得分:9)
echo
和read
命令都通过文本界面工作,例如运行脚本的终端窗口。如果在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/bash
。 read
是内置的bash,而您目前没有使用bash运行脚本。 /bin/sh
实际上可能是/bin/bash
的链接,但根据维基百科,这取决于您拥有的OS X的特定版本。
你的脚本应该在bash下正常工作。
答案 4 :(得分:0)
NAME是空的还是只是输出$ NAME作为字符串?如果是后者你应该尝试〜/ Desktop / $(NAME)
此外,您应该尝试XDialog(或MacOS中的任何工具。)有很多资源可用于输入处理。