我的脚本接受任意数量的参数和几个选项:
我需要将任何选项加上第一个参数提取到一个字符串中,并将任何剩余的参数提取到第二个字符串中。 IE:
./script.sh foo FILE1 [s1="foo" s2="FILE1]"
./script.sh foo FILE1 FILE2 FILE3 [s1="foo" s2="FILE1 FILE2 FILE3]"
./script.sh -i -l foo FILE1 [s1="-i -l foo" s2="FILE1]"
./script.sh -i -l foo FILE1 FILE2 FILE3 [s1="-i -l foo" s2="FILE1 FILE2 FILE3]"
我只需要拆分$@
成这两个字符串。我不需要处理参数,即使用getopt
。
做到这一点最简单的方法是什么?
编辑:提取到数组数组而不是字符串就可以了。
答案1
set -o extendedglob
first_set=("$@[1,(i)^-*]")
first=${(j[ ])first_set}
将存储在所有参数的串联中,直到第一个参数之间$first
不以空格字符开头。-
那么对于$second
,你可以得到剩下的:
second_set=("$@[$#first_set + 1, -1]")
second=${(j[ ])second_set}
无论如何,请注意这$@
不是细绳,它是 0 个或多个字符串的列表。
例如,如果您使用命令行从类似 Bourne 的 shell 调用脚本,例如:
script.sh -i -l 'foo bar' 'File 1' File\ 2 "File 3"
这将执行您的脚本:
execve("/path/to/script.sh", ["script.sh", "-i", "-l", "foo bar",
"File 1", "File 2", "File 3"], environ)
变成(假设脚本以 开头#! /bin/zsh -
):
execve("/bin/zsh", ["/bin/zsh" /* or "script.sh" depending on the system*/,
"-", "/path/to/script.sh", "-i", "-l", "foo bar",
"File 1", "File 2", "File 3"], environ)
在您的脚本中,$@
将包含后面的argv[]
参数中的所有这些字符串。execve()
/path/to/script.sh
上面我们将该列表分成两部分套($first_set
和$second_set
数组变量),然后将这些集合中的参数连接成两个标量变量($first
和$second
)。但连接完成后,您将无法再返回到原始参数列表。例如,$second
在这种情况下将包含File 1 File 2 File 3
,并且无法区分哪些空格字符是分隔参数的字符以及哪些空格字符是参数的一部分。