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

时间:2016-01-03 18:21:14

标签: macos bash command arguments prompt

我正在处理用户通过双击文件执行的bash脚本(专门用于OS X)。我用.command替换了.sh结尾,所以它由终端本机打开,之后一个小的描述文本告诉用户该做什么。脚本等待输入,我希望像命令行参数一样处理。让我可以使用$ 1,$ 2,$ 3,......以及在脚本中使用“shift”命令来访问单个“单词”。

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

read var1 var2 var3

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

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

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

read -ra args

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

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

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

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

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

答案 1 :(得分:1)

这不会处理引号,但应该起作用:

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

read VARS
doStuff $VARS

这是有效的,因为变量扩展在$ VARS上发生,然后调用 doStuff ,扩展命令将类似于 doStuff foo bar baz 42 23 fin