小写命令输出,而不是变量?

Phi*_*lip 5 zsh

在 zsh 中,假设我想要一个小写的 UUID。 uuidgen返回大写,所以我可以这样做:

export MY_UUID=`uuidgen`      # get uppercase UUID
export MY_UUID=${MY_UUID:l}   # convert to lowercase
Run Code Online (Sandbox Code Playgroud)

但我真正想要的是:

${`uuidgen`:l}                # does not work!
Run Code Online (Sandbox Code Playgroud)

我什至不需要变量;只是输出。我创建该变量只是因为我找不到立即获取并小写命令输出的方法。

是否有一种语法可以让我一步获得命令的小写输出?

小智 9

您不需要有变量。你可以做:

\n
echo ${(L)$(uuidgen)}          # nested parameter expansion\n
Run Code Online (Sandbox Code Playgroud)\n

或者:

\n
print ${$(uuidgen):l}          # history modifiers\n
Run Code Online (Sandbox Code Playgroud)\n

从网页参考:

\n
\n

14.3.2 规则

\n
    \n
  1. 嵌套替换\n如果存在多个嵌套 ${...} 形式,则从内向外执行替换。
  2. \n
\n
\n

来自man zshexpn(这很清楚):

\n
\n

如果使用 ${...} 类型参数表达式或 $(...) 类型命令替换来代替上面的 name,则首先对其进行扩展,然后使用结果,就好像它是 name 的值一样。因此可以执行嵌套操作: ${${foo#head}%tail} 替换 $foo 的值,同时head\' and 删除 tail\'。\n带有 $(...) 的形式通常与接下来描述的标志;请参阅下面的示例。\n参数扩展中的每个名称或嵌套 ${...} 也可以后跟下标表达式,如 zshparam(1) 中的数组参数中所述。

\n
\n

使用以下命令行获取它:

\n
$ LESS=+\'/If  a .* type parameter\' man zshexpn\n
Run Code Online (Sandbox Code Playgroud)\n

并且,对于历史修饰符扩展 ( ${ \xe2\x80\xa6 :l})(重点是我的),zsh 文档(下面摘录)和 都man zshexpn包含相同的文本:

\n
\n

14.1.4 修饰符\n在可选字指示符之后,您可以添加一系列一个或多个以下修饰符,每个修饰符前面都有一个 \xe2\x80\x98:\xe2\x80\x99。这些修饰符还适用于文件名生成\n和参数扩展的结果

\n
\n