在 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
您不需要有变量。你可以做:
\necho ${(L)$(uuidgen)} # nested parameter expansion\nRun Code Online (Sandbox Code Playgroud)\n或者:
\nprint ${$(uuidgen):l} # history modifiers\nRun Code Online (Sandbox Code Playgroud)\n从网页参考:
\n\n\n14.3.2 规则
\n\n
\n- 嵌套替换\n如果存在多个嵌套 ${...} 形式,则从内向外执行替换。
\n
来自man zshexpn(这很清楚):
\n\n如果使用 ${...} 类型参数表达式或 $(...) 类型命令替换来代替上面的 name,则首先对其进行扩展,然后使用结果,就好像它是 name 的值一样。因此可以执行嵌套操作: ${${foo#head}%tail} 替换 $foo 的值,同时
\nhead\' and删除 tail\'。\n带有 $(...) 的形式通常与接下来描述的标志;请参阅下面的示例。\n参数扩展中的每个名称或嵌套 ${...} 也可以后跟下标表达式,如 zshparam(1) 中的数组参数中所述。
使用以下命令行获取它:
\n$ LESS=+\'/If a .* type parameter\' man zshexpn\nRun Code Online (Sandbox Code Playgroud)\n并且,对于历史修饰符扩展 ( ${ \xe2\x80\xa6 :l})(重点是我的),zsh 文档(下面摘录)和 都man zshexpn包含相同的文本:
\n\n14.1.4 修饰符\n在可选字指示符之后,您可以添加一系列一个或多个以下修饰符,每个修饰符前面都有一个 \xe2\x80\x98:\xe2\x80\x99。这些修饰符还适用于文件名生成\n和参数扩展的结果
\n