如何从文件名 glob 创建一个可能为空的数组?

kjo*_*kjo 3 scripting bash array wildcards

使用zsh,根据(可能为空)文件名 glob 的结果创建一个可能为空的数组并不困难。例如:

% pathlist=( /no/such/path/*(N) ); printf -- "%d\n" $#pathlist
0
Run Code Online (Sandbox Code Playgroud)

bash,然而,最接近的近似我可以想出上述代码失败时的水珠为空,以产生一个空数组:

% pathlist=( /no/such/path/*    ); printf -- "%d\n" ${#pathlist[@]} )
1
Run Code Online (Sandbox Code Playgroud)

在这种情况下,该pathlist变量包含一个条目,即字符串“/no/such/path/*”。

如何修改bash代码,以便pathlist为与 glob 匹配的每个文件(如果有)只包含一个条目?

jes*_*e_b 7

您需要使用 shell 选项 nullglob

#!/bin/bash
shopt -s nullglob
pathlist=( /no/such/path/*    ); printf -- "%d\n" "${#pathlist[@]}" )
shopt -u nullglob
Run Code Online (Sandbox Code Playgroud)

Bash 手册对nullglobshell 选项做了以下说明:

如果设置,Bash 允许不匹配任何文件的文件名模式扩展为空字符串,而不是它们本身。

  • 注意 `declare -p pathlist` 是一种转储数组变量的好方法。 (2认同)