0

我想使用参数替换来计算基于

  1. 一个变量被定义
  2. 要使用的第一个默认目录(如果存在)
  3. 如果 1 或 2 都不可用,则使用 $HOME 目录中的文件。

变量 (#1) 和 $HOME (#3) 中的文件很简单:

${KEEPER_HOME:-$HOME/.keeper}

但是在 Zsh 中是否有 #2 的参数/变量替换语法?如果我们想象这样||做,我会寻找这样的东西:

${KEEPER_HOME:-$HOME/.config/keeper||$HOME/.keeper}

当然我可以用testinside来做$(......)但我希望存在更简洁和可读的东西。

4

2 回答 2

0

这仅使用参数扩展,但它是两行:

glob=($HOME/.config/keeper(N/))
result=${KEEPER_HOME:-${glob:-$HOME/.keeper}}

glob=行使用/glob 限定符来检查目录。N限定符打开nullglob,因此如果目录不存在,变量将为空。

可能有一种方法可以将通配符移动到嵌套参数扩展中,但我还没有找到。

于 2021-04-07T08:27:00.777 回答
0

您可以使用null glob 限定符来检查文件(包括目录)是否存在:

% print /etc(N)
/etc
% print /foo(N)

当作为参数传递时,这也适用于参数扩展:

% print ${:-/etc(N)}
/etc
% print ${:-/foo(N)}

但是,如果您想在分配参数时使用 null glob,则需要在扩展参数时使用$~glob 替换:

% tmp=${:-/foo(N)} 
% print $tmp
/foo(N)
% print $~tmp

% 

但是,对于您的确切情况,您将需要添加$(命令替换)以强制更早地评估模式,但是您也不再需要使用$~glob 替换:

% print ${${:-/foo(N)}:-bar}   

% print ${$(print /foo(N)):-bar} 
bar
% tmp=${${:-/foo(N)}:-bar}
% print $tmp 
/foo(N)
% tmp=${$(print /foo(N)):-bar}
% print $tmp                       
bar
% 
于 2021-04-07T08:54:43.843 回答