10

我创建了一个 shell 脚本,它需要一个人输入他们的名字然后生成一个报告。chmod当编辑到可执行脚本并从终端运行时,该脚本会根据需要工作。但是,我想部署它并让它成为一种双击解决方案,而不是指示人们从终端运行它。

我尝试将脚本包装在 Platypus 中,这样可以轻松启动。但它不允许来自用户的输入,这很关键。

我刚刚找到cocoaDialog,但我主要担心的是它是否会提供我需要的功能,并且在没有其他人安装它的情况下这样做。

有没有人遇到过这种情况或可以提供任何指示?

  • 在脚本顶部添加一个 shebang 行,例如:#!/bin/bash并使脚本可执行使用chmod +x script.sh就是这样。 
    – hek2mgl
     2015 年 6 月 15 日 20:55 
  • 当我运行脚本时,我知道我的脚本在终端内完美运行。我正在寻找能够双击文件的功能..让它运行并接收输入。如果我将文件保存为脚本,用户将不得不从终端运行它或更改文件关联以启动脚本。  2015 年 6 月 15 日 21:34
  • 嗯,在 Linux 上,可以双击可执行的 shell 脚本以从桌面执行它。如果你想要更复杂的东西(图标、描述等),你需要创建一个 .desktop 文件(至少在 Gnome 中它们被称为 .desktop)。我猜在 OSX 中是类似的东西。 
    – hek2mgl
     2015 年 6 月 15 日 21:48 
  • 顺便说一句,你为什么不在发布问题之前使用谷歌?我发现这没有问题:stackoverflow.com/questions/5125907/ ... 
    – hek2mgl
     2015 年 6 月 15 日 21:51
  • 1
    不过我确实欠你一个道歉。该链接(我之前阅读过)也确实有我正在寻找的答案。这使它成为一个 .command 分机。我只是碰巧没有读到那么远,因为它没有被标记为解决方案。谢谢。  2015 年 6 月 16 日 16:24

3 个回答  正确答案  

19

作为记录,我测试了(在 OS X Yosemite 上)以下脚本 ( namescript),它使用read命令接受用户输入。之后chmod +x namescript,双击 Finder 正确启动脚本并接受用户输入。

    #! /bin/bash

    echo "Please enter your name"
    read name
    echo "Your name is $name"

为脚本选择一个没有扩展名(如namescript)或.command扩展名(namescript.command)的名称很重要。默认情况下,使用.shnamescript.sh) 会导致双击以在文本编辑器中打开脚本,如 OP 中所述。

  • 当脚本与终端打开相关联时,它可以完美运行。但默认是在文本编辑器中打开,这可能会给我带来问题。  2015 年 6 月 16 日 16:26
  • 好的,如果你离开“.sh” - 所以你有一个没有扩展名的可执行文件 - 它可以通过终端正确打开而不会摆弄与操作系统相关的应用程序设置。  2015 年 6 月 17 日 2:29
  • 问题是如果我部署它并且有人下载脚本,权限被剥夺并且用户必须在下载后在他们的末端进行 chmod 以便他们可以运行它。  2015 年 6 月 17 日 22:00
  • 是的,您希望将其打包为 zip 文件以使其可执行。  2015 年 6 月 18 日 4:48
  • 仅供参考,在 OS 10.11+ 中,可能会弹出一个错误消息,提示“来自身份不明的开发人员的脚本”。解决方法是告诉您的用户 (1)Right-Click文件,(2)Hold Shift在菜单仍显示 (3) 的同时Choose Open,仍按住 Shift (4) 单击Open出现的对话框。它永远不会再向您询问此文件。 
    – 解雇
     2016 年 5 月 31 日 23:34
4

OS X 包含(大部分)所有电池,只需使用它即可。:)

为此,您可以使用Automator.app使用 Automator,您可以创建可执行应用程序(例如your.app),其中将包含您的 shell 脚本并要求用户输入。

例如,要求两个输入:“姓名”和“年份”,您应该执行以下操作:

  • 启动自动程序

  • 选择“应用程序”

  • 如果库被隐藏,请单击工具栏上的“库”按钮

  • 将以下操作从库中拖到工作流中

    • 选择“传递输入”->“作为参数”

    • 将您的 shell 脚本复制并粘贴到窗口中,例如:

    • 选择“名称”

    • "输入第二个问题,例如"输入年份:"

    • 添加默认值,例如 2015(如果需要)

    • 单击“需要回答”复选框

    • 检查“选项”中的“忽略此操作输入”

    • 创建新变量“名称”

    • 输入问题:“名字和姓氏:”

    • 点击“需要回答”

    • “询问文本”

    • “变量的设定值”

    • “询问文本”

    • "获取变量值

    • “运行 Shell 脚本”

year="$1"
name="$2"
echo "Report for name: $name year: $year"
  • 此外,您还可以添加最终操作“复制到剪贴板”,例如,shell 脚本的输出将进入剪贴板。

保存脚本(您将获得一个name.app标准的 OS X.app应用程序),只需将其添加到其中.dmg.zip从中创建一个,您就可以部署它。

如阅读此答案,一切都快得多。;)

  • 我会试一试,似乎我将不得不调整我的脚本,因为我在其中声明了我的名字和姓氏变量..所以我可能会从脚本本身中取出这些变量..我会更新我什么时候可以试试看。  2015 年 6 月 15 日 21:38
  • 该解决方案适用于我需要的工作流程。我在使用 : 根据首字母命名我的文件时遇到问题,initial="$(echo $first_name | head -c 1)" touch ~/Desktop/$initial$last_name但这可能只需要我稍微调整一下。感谢所有帮助过的人。  2015 年 6 月 16 日 15:59
  • 请注意:使脚本可执行并使其成为 .command ext 似乎也对我有用。  2015 年 6 月 16 日 16:27
  • @SpacemanTrip 是的,如果您可以启动终端,.command任何脚本的扩展都将启动 terminal.app 并在其中运行脚本。(但是,没有 GUI)。:) 
    – clt60
     2015 年 6 月 17 日 10:26
  • 实际上我放弃了 Automator,因为它没有正确处理变量,而且我无法让我的输出文件以我的名字和姓氏命名......  2015 年 6 月 17 日 21:53
2

据我了解,我建议您查看 Applescript,因为这将使您拥有 GUI 界面并执行“SHELL”命令。

首先,我会打开预装在 Mac 上的“脚本编辑器”程序

这是一个示例脚本,它要求输入用户名,然后通过执行 shell 命令“say name”说出它

display dialog "What is you name? " default answer "" buttons {"Say It"} default button 1
text returned of the result
do shell script "say " & result

您还可以附加with administrator privileges到 do 命令,这将使它以管理员权限运行(询问管理员用户名和密码)

例子:

display dialog "What is you name? " default answer "" buttons {"Say It"} default button 1
text returned of the result
do shell script "say " & result with administrator privileges

希望这有所帮助。

您的答案


来自   https://stackoverflow.com/questions/30854358/mac-osx-allow-for-user-input-in-shell-script-via-gui-or-prompt



如何在 Bash 中提示输入?

在创建 Bash 脚本时,通常需要根据用户输入执行计算。在本指南中,在使用 shell 脚本执行基本操作之前,首先让我们看一下解释和验证用户输入。我们将使用集成的 Bash 读取命令来解释 Bash 用户输入。读取命令通过用户获取一些值作为输入并将其分配给变量。它通过 Bash 命令终端只读出一行。在本指南中,您将学习如何解释来自终端和脚本的用户输入。

要实现读取命令,语法如下:

read <variable name>

示例 01:

让我们举一个简单的例子,在出现提示时在 bash 中读取用户的输入。打开终端并创建一个新文件“input.sh”。

0秒0秒成交量0%
 

打开文件并向其中添加一些代码,如下所示。首先,echo 语句要求用户添加输入值。读取语句用于输入用户值,该值将保存到变量“NAME”中。最后一个 echo 语句用于打印输入值为“$NAME”变量的答案。

使用 bash 命令执行该文件。首先,它会提示输入名称。当用户输入值“Aqsa”时,它将打印包含其中值的消息。

示例 02:

打开旧文件并将以下代码写入其中。我们可能正在使用集成读取命令;给有查询的用户,使用那个 -p 选项。您必须使用“readline”关键字 -e 来使用箭头键进行行编辑。之后,使用该变量打印用户在命令 shell 中输入的文件的路径。

让我们在终端中使用 bash 命令检查这段代码的输出。您会看到它将要求在 shell 中输入文件路径。当你输入需要的值并回车时,它会打印出来。

bash input.sh

如果你想建议一个答案,你必须在字符串后使用关键字“-i”,路径用引号括起来。

让我们使用 bash 命令检查更新代码的输出。您会发现它会建议您一个文件路径,如下所示。

示例 03:

让我们来看另一个提示在 shell 中输入的示例。在文件“input.sh”中写下以下代码。我们有两个读取命令来添加用户在 shell 上的登录凭据。关键字“-sp”用于在进入 shell 时隐藏凭证“Password”。

在执行时,您可以看到用户输入了其凭据,而密码在输入时是隐藏的。最后,它显示了对用户表示感谢的消息。

示例 04:

我们还有另一个示例,从用户的 bash shell 中读取多个汽车名称作为值。为此,我们需要三个变量“car1”、“car2”和“car3”。我们有一个回声评论,要求提供汽车的名称。读取命令用于读取用户在 shell 中输入的值(汽车名称)。接下来的三个 echo 语句将连续打印带有汽车名称的消息。

使用 bash 命令,执行该文件。它会询问您喜欢的汽车的名称。当用户连续输入汽车名称时,它会将它们保存到一个读取命令的变量中,并使用接下来的三个回显语句将它们一一打印出来。

示例 05:

在上面的例子中,我们看到了如何提示用户输入,同时将输入保存到三个变量中。在这个例子中,我们将学习如何使用关键字“-a”将用户输入的值作为数组成员读取到一个变量中。因此,打开同一个文件并在其中写入以下代码。echo 语句将要求您输入所需的输入。读取语句有关键字“-a”,从用户那里获取多个值,并将它们保存到一个变量数组“NAMES”中。在最后一个 echo 语句中,所有输入的值都打印为字符串文本中的数组成员。

在运行文件“input.sh”时,系统会提示用户输入值。当用户输入值时,这些值已被保存到数组变量“NAMES”中。保存这些值后,将执行 echo 语句并将输入的名称作为数组值打印出来,如图所示。


示例 06:

让我们在脚本中稍作改动的情况下使用相同的文件。我们已经编写了两个读取命令来从用户那里获取值作为 shell 中的输入,并将它们保存在两个变量“NUM1”和“NUM2”中。之后,两个变量都被打印出来了。

在命令终端中,写入chmod命令,为该文件赋予执行权限。

chmod +x input.sh

当您使用 bash 执行此文件时,您会看到它会提示您连续添加数字。当您输入所需的值时,它将分别打印出两个数字。

如果您想验证用户是否将任何字段或变量留空,您可以更新之前的代码,如下所示。关键字“-z”用于检查两个变量中是否有空格。

执行时,用户添加了空格作为数字。用户收到重试消息,因为用户输入的变量有空格。

让我们在用户输入的数字的某些条件下尝试使用相同的代码。如果用户输入的是下面代码中提到的字符以外的任何字符,它将传递一条消息。

在尝试此代码时,用户添加了一个特殊字符,这会生成一条提示消息。

结论

在本指南中,您已经成功地学习了如何在 shell 中提示用户输入并使用一些非常简单的示例解释用户输入。



来自  https://linuxhint.com/prompt-for-input-bash/

我有两段代码。一个是 Applescript,另一个是 Bash shell 脚本。shell脚本需要和applescript同时运行,返回一些值然后退出。问题是 shell 脚本的read -p提示在使用do shell script "/path/to/script.sh".

我想也许

display dialog "Query?" default answer ""
set T to text returned of result

可以替换read -p提示,但我无法弄清楚如何使这两种方式都起作用。cam 如何使用这些方法中的任何一种来正确询问和等待用户输入?

我意识到我可以将 applescript 分成两部分,一部分放在 shell 脚本的开头,另一部分放在最后一个 shell 命令之后。

#!/bin/bash

osascript ~/Start_Script.scpt

echo 'enter some Text'
read -p "" T

## for things in stuff do more 
## stuff while doing other things
## done 

osascript ~/End_Script.scpt

这就是我一直在做的,它确实有效。但它需要使用适合我的终端。但是,如果我想向像我妈妈这样的人展示……好吧,她不会打开终端应用程序。因此,最好找到一种read -p在 Applescript 本身中模拟命令并能够将变量传递给嵌入式 shell 脚本的方法。

3 个回答     正确答案  


12

嵌入到 shell 脚本中的 AppleScript 通常是杂乱无章、难以阅读且难以正确引用的。

我通过使用这种结构来解决这个问题。

#!/usr/bin/env bash

read -r -d '' applescriptCode <<'EOF'
   set dialogText to text returned of (display dialog "Query?" default answer "")
   return dialogText
EOF

dialogText=$(osascript -e "$applescriptCode");

echo $dialogText;


  • 2个
    我实际上认为这是一个更好的答案,因为它更符合我当时尝试做的事情。无论如何,这就是我最终使用的。还介绍了我现在一直在使用的 heredocs。因此,对于所有未来的读者,我鼓励您先尝试这个答案。我相信这是一个更健壮和更清晰的代码。 
    – I0_ol
     2017 年 9 月 21 日 12:53
5个

我认为你需要的是:

set T to text returned of (display dialog "Query?" buttons {"Cancel", "OK"} default button "OK" default answer "")

如果您想从 bash 脚本执行此操作,则需要执行以下操作:

osascript -e 'set T to text returned of (display dialog "Query?" buttons {"Cancel", "OK"} default button "OK" default answer "")'

如果您需要,我可以更详细地解释它,但我认为它是不言自明的。

编辑:如果您希望将结果作为 shell 变量,请执行以下操作:

SHELL_VAR=`osascript -e 'set T to text returned of (display dialog "Query?" buttons {"Cancel", "OK"} default button "OK" default answer "")'`

您在反引号 (` `) 之间键入的所有内容都会在主命令之前由 shell 评估(执行)。有关详细信息,请参阅此答案。

我同意这有点“hacky”,而且我相信有更好的方法可以做到这一点,但这很有效。

0

这是一个稍微更简洁的例子:

PROMPT_RETURNED="$(osascript -e 'text returned of (display dialog "How many, eh?" default answer "")')"
echo "$PROMPT_RETURNED"
  • 只是运行osascript -e 'text returned of (display dialog "How many, eh?" default answer "")'当然会向终端输出相同的东西,但在我的示例中,我将返回值分配给一个变量,因为大概该值稍后将在 shell 函数中使用。  2021 年 11 月 20 日 1:56

您必须登录才能回答这个问题。

来自   https://apple.stackexchange.com/questions/239764/how-can-i-run-a-shell-script-that-prompts-for-user-input-from-within-applescript