在 bash 脚本中提示用户输入并像命令行参数一样读取它?

Prompt for user input in bash script and read it like command line arguments?

我正在开发一个 bash 脚本(专门用于 OS X),用户可以通过双击该文件来执行该脚本。我用 .command 替换了 .sh 结尾,这样它就可以由终端本机打开,之后一小段描述文本告诉用户要做什么。该脚本等待输入,我很乐意像命令行参数一样处理它。让我可以使用 $1、$2、$3... 访问单个 "words",并在脚本中使用 "shift" 命令。

我发现 "read" 命令可以将输入保存到变量,但是访问默认变量 $REPLY 会给我整个输入作为字符串。使用代码

read var1 var2 var3

通过按我想要的方式拆分输入让我更接近一步,但仅限于固定数量的变量(在本例中为 3)。理论上,用户输入可以是一百个参数或更多,这就是为什么创建这么多变量感觉很愚蠢的原因。我也可以解析默认的 $REPLY 变量并用空格分隔它,但我觉得必须有一种更简单的方法来处理用户输入,就像命令行参数一样。

感谢您的宝贵时间。

在 bash 中,一种选择是使用 -a 开关将输入读入数组:

read -ra args

然后您可以访问每个参数,例如 "${args[0]}""${args[1]}"

我还使用了 -r 开关,因为它以更明智的方式处理包含反斜杠的输入(即它不会尝试为您做任何聪明的事情,它只是保留字符串,因为它们是)。

如果您想一个一个地处理每个参数,另一种选择是使用循环:

while read -r arg
do
    # whatever with each argument
done

循环将继续,一次处理一个参数,直到用户输入 Ctrl-d.

这不会处理引号,但应该可以正常工作:

doStuff() {
    echo first of $# args is 
}

read VARS
doStuff $VARS

这是可行的,因为在调用 doStuff 之前,变量扩展发生在 $VARS 上,并且扩展的命令类似于 doStuff foo bar baz 42 23 fin