我正在处理用户通过双击文件执行的bash脚本(专门用于OS X)。我用.command替换了.sh结尾,所以它由终端本机打开,之后一个小的描述文本告诉用户该做什么。脚本等待输入,我希望像命令行参数一样处理。让我可以使用$ 1,$ 2,$ 3,......以及在脚本中使用“shift”命令来访问单个“单词”。
我发现“read”命令可以保存对变量的输入,但是访问默认变量$ REPLY会将整个输入作为字符串给出。使用代码
read var1 var2 var3
通过像我想要的那样分割输入让我更近一步,但仅限于固定数量的变量(在这种情况下为3)。理论上,用户输入可以是一百个或更多的参数,这就是为什么创建这么多变量感觉很愚蠢。我也可以解析默认的$ REPLY变量并用空格分隔它,但我觉得必须有一种更简单的方法来处理用户输入,就像命令行参数一样。
感谢您的时间。
答案 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 。