如果我想设置如下值:
key="some"
value=$(cat ${filename} | grep ${key}"string" | cut -d 'string' -f2)
如何让${key}"string"
工作?它不会处理${key}
变量以将其与字符串连接起来。我想这样做:
cat $filename | grep "somestring" | cut...
答案 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"
也就是说,如果可能有多个匹配,并且您需要之间的字符串匹配每行,则可以调整此解决方案。