我需要以编程方式将 glob 模式(如../smth*/*, 或/etc/cron*/)扩展到文件列表中。最好的方法是什么?
man*_*ork 55
让它在数组声明的右侧展开:
list=(../smth*/) # grab the list
echo "${#list[@]}" # print array length
echo "${list[@]}" # print array elements
for file in "${list[@]}"; do echo "$file"; done # loop over the array
Run Code Online (Sandbox Code Playgroud)
注意nullglob需要设置shell选项。
默认情况下未设置。
它可以防止在 glob(或多个 glob 之一)与任何名称不匹配的情况下出错。
将其设置bash为
shopt -s nullglob
Run Code Online (Sandbox Code Playgroud)
或zsh与
setopt nullglob
Run Code Online (Sandbox Code Playgroud)
compgen是一个 Bash 内置程序,您可以将转义(!)模式传递给它,它会输出匹配项,根据是否存在返回 true 或 false。如果您需要从变量/脚本参数传递全局模式,这尤其有用。
glob_pattern='../smth*/*'
while read -r file; do
# your thing
echo "read $file"
done < <(compgen -G "$glob_pattern" || true)
Run Code Online (Sandbox Code Playgroud)
添加 || true可防止错误返回compgen导致任何问题。此方法避免了没有匹配的问题,并且不需要更改 nullglob 选项。
如果您需要数组中的项目,只需files=()在循环之前和files+=("$file")循环内部初始化一项即可。然后,您可以通过简单地使用 来检查数组的长度来查看是否有任何匹配项if [[ ${#files[@]} -gt 0 ]]; then。
| 归档时间: |
|
| 查看次数: |
28111 次 |
| 最近记录: |