与命令替换中的参数连接

时间:2016-10-29 12:27:02

标签: bash

如果我想设置如下值:

key="some"
value=$(cat ${filename} | grep ${key}"string" | cut -d 'string' -f2)

如何让${key}"string"工作?它不会处理${key}变量以将其与字符串连接起来。我想这样做:

cat $filename | grep "somestring" | cut...

1 个答案:

答案 0 :(得分:3)

将变量引用${key}与文字"string"正确连接,在双引号字符串中嵌入变量引用

key="some"
... | grep "${key}string" | ...

注意现在如何将{...}中的变量名实际所需包含在内,以告诉shell变量名称的结束位置。 chepner在其他地方的评论中指出: " ${key}是执行参数扩展的规范方式。当不需要括起扩展操作符或消除参数名称歧义时,可以选择删除大括号。 "

使用特定的示例值"some",您的串联(${key}"string")的工作方式相同,但通常,因为使用{ {1}} 不加引号使其受shell expansions的限制,特别是分词,如果变量{{{}} {{}},则会破坏${key}命令1}}恰好包含空格

然而,代码的主要问题是您将多字符字符串传递给grep以指定分隔符,而仅支持单个字符

如果你有 GNU ${key},你可以尝试以下方法:

cut -d

这将从匹配的行返回 grep之后的所有,这就是我认为你的意图。
假设key="some" value=$(grep -Po "${key}string"'\K.*$' "${filename}") 每行匹配最多一次

小警告是,您现在可能必须在"${key}string"的值"${key}string"以及文字部分(.)中转义正则表达式元字符,以使其正常工作作为正则表达式。

使用相同的假设和警告,您可以尝试这个符合POSIX的${key}解决方案:

"string"

也就是说,如果可能有多个匹配,并且您需要之间的字符串匹配每行,则可以调整此解决方案。