在 zsh 中,假设我想要一个小写的 UUID。 uuidgen
返回大写,所以我可以这样做:
export MY_UUID=`uuidgen` # get uppercase UUID
export MY_UUID=${MY_UUID:l} # convert to lowercase
但我真正想要的是:
${`uuidgen`:l} # does not work!
我什至不需要变量;只是输出。我创建该变量只是因为我找不到立即获取并小写命令输出的方法。
是否有一种语法可以让我一步获得命令的小写输出?
答案1
您不需要有变量。你可以做:
echo ${(L)$(uuidgen)} # nested parameter expansion
或者:
print ${$(uuidgen):l} # history modifiers
从网页参考:
14.3.2 规则
- 嵌套替换 如果存在多个嵌套的 ${...} 形式,则替换将从内向外执行。
来自man zshexpn
(这很清楚):
如果使用 ${...} 类型参数表达式或 $(...) 类型命令替换来代替上面的 name,则首先对其进行扩展,然后使用结果,就好像它是 name 的值一样。因此可以执行嵌套操作: ${${foo#head}%tail} 替换 $foo 的值,同时
head' and
删除 tail'。 $(...) 的形式通常与下面描述的标志结合使用;请参阅下面的示例。参数扩展中的每个名称或嵌套 ${...} 后面也可以跟一个下标表达式,如 zshparam(1) 中的数组参数中所述。
使用以下命令行获取它:
$ LESS=+'/If a .* type parameter' man zshexpn
并且,对于历史修饰符扩展 ( ${ … :l}
) (强调我的)zsh 文档(摘录如下)并且man zshexpn
包含相同的文本:
14.1.4 修饰符 在可选字指示符之后,您可以添加一系列一个或多个以下修饰符,每个修饰符前面都有一个“:”。这些修饰符还处理文件名生成和参数扩展的结果