【发布时间】:2018-07-20 20:06:09
【问题描述】:
我需要像这样设置一个变量:
./configure ... PKG_CONFIG_PATH=/usr/local/opt/libxml2/lib/pkgconfig:/usr/local/opt/imagemagick/lib/pkgconfig:/usr/local/opt/gnutls/lib/pkgconfig
一个明显的方法是使用Brace Expansion:
PKG_CONFIG_PATH=/usr/local/opt/{libxml2,imagemagick,gnutls}/lib/pkgconfig
PKG_CONFIG_PATH=${PKG_CONFIG_PATH// /:}
但是,这不起作用(大括号扩展不会发生在变量设置中,而且,当扩展 完成时,分隔符是一个 空格 并且有似乎没有办法改变这一点。
那么,有没有办法避免每个包显式前缀和后缀的丑陋?
【问题讨论】:
-
“分隔符是空格”?大括号扩展根本不会创建“空格”或任何其他字符;它创建 words,前缀和后缀内容重复。这些词是完全独立的 C 字符串;您没有包含文字空格的单个字符串,您有 单独的、独立的字符串,每个结果一个。这类似于
"${array[@]}"不会在数组元素之间插入空格——而是将它们扩展为每个单词。 -
这就是 chepner 的答案中的数组方法有效的原因——一个数组可以存储多个独立的字符串——以及为什么原始代码没有——因为你正在扩展为一个上下文(分配给一个标量/string-type 变量),其中多个字符串无效。
标签: bash brace-expansion