【发布时间】:2019-07-31 14:52:14
【问题描述】:
我正在尝试提取作为命令行 bash 脚本选项输入的键的值,但失败了。
我已经尝试将正则表达式与 grep 和 sed 匹配,无论是否使用 -E 选项。我可以使用 grep 从初始命令输入中提取键:
grep -wo -- "-[^ ]*"
可以从命令行中提取具有"-" 或"--" 格式的键,但如果没有其他键,我需要两个键之间的值或从键到行尾的值。
key="-r"
input="command -r root1 root2 -s ip"
echo $input | sed "s/^.*$key \([^-]\+\)\( -.\+$\|$\)/$key has value \1/g;"
输出:
命令 -r root1 root2 -s ip
预期输出:
root1 根2
显然,\1 匹配整行,但我只需要从$key 到下一个键或行尾的输入行的内容。任何帮助将不胜感激。
【问题讨论】:
-
您是否特别想获取选项
-r的值? -
在这个例子中,是的。脚本有许多开关。我有一个用于开关
$(echo "$*" | grep -wo -- "-[^ ]*" )的变量,然后循环通过开关,用case 语句解析它们,然后根据开关的值执行一些不同的命令。开关具有 -a 或 --assign 之类的值,每个开关可以具有一个或多个值,具体取决于输入是选项还是设备列表。命令行输入的一些示例是:command.sh device1 device2、command.sh device1 -s ip、command.sh --root CompanyDevice --first 35 --last 99" -
另外,我建议检查一下 bash 的
getopts内置功能。 (只需在bash终端上运行help getopts。) -
如果你分开
$1,$2然后使用input="$*",那么这是错误的方法。只是循环通过"$@"是更好的选择。使用for或getopts手动循环。谷歌getoptsexamples。应该有很多。请注意,getopts和getopt是不同的。getopts更简单,并且内置在 bash 中。