例如,我有一个字符串/something an-arg=some-value another-arg=another-value
。
将an-arg
的值提取到一个变量中,将another-arg
的值提取到另一个变量中,最直接的方法是什么?
为了更好地举例说明,这就是我需要发生的:
STRING="/something an-arg=some-value another-arg=another-value"
AN_ARG=... # <-- do some magic here to extract an-arg's value
ANOTHER_ARG=... # <-- do some magic here to extract another-arg's value
echo $AN_ARG # should print `some-value`
echo $ANOTHER_ARG # should print `another-value`
因此,我一直在寻找一种简单/直接的方法来实现这一点,我尝试了:
ARG_NAME="an-arg="
AN_ARG=${STRING#*$ARG_NAME}
但是这个解决方案的问题是,它将打印an-arg
之后的所有内容,包括第二个参数的名称和它的值,例如some-value another-arg=another-value
。
2条答案
按热度按时间pgvzfuti1#
让数据集任意变量会带来很大的安全风险。您应该给您生成的变量加前缀(前缀中至少有一个小写字符,以将生成的变量保留在POSIX为应用程序保留的名称空间中),或者将它们放在一个关联数组中;下面的第一个示例执行后者。
生成关联数组
正如您在https://ideone.com/cKcMSM上看到--
...正确发射:
...因此您可以引用
${vars[an-arg]}
、${vars[another-arg]}
或${vars[third-arg]}
。这避免了原始建议中的错误,在原始建议中,字符串可以设置对系统有意义的变量--更改
PATH
、LD_PRELOAD
或其他安全敏感值。生成前缀名称
要以另一种方式执行此操作,可能看起来像这样:
...如您在https://ideone.com/zUBpsC中看到的那样,创建了三个单独的变量,每个变量的名称都带有
var_
前缀:vlju58qv2#
假设条件:
-
)转换为下划线(_
)一个使用名称引用的
bash
想法:这将生成:
注意事项:
for
循环处理完成,访问新变量将需要预先知道新变量的名称for
循环后的访问变得相当容易(例如,新变量名只是关联数组的索引)