测试具有扩展名的现有文件失败并使用通配符

问题描述

只是一个简单的终端会话:

$ # the file really exists
$ [[ -e mydir/564df455-92e6-ac59-9b96-b3665f2aa3c7.vmem ]]
$ echo $?
0
$ # not with globbing though
$ [[ -e mydir/*.vmem ]]
$ echo $?
1

通配符 * 应该代表任意数量的字符。嗯。

我错过了什么?

更新

compgen 按预期工作:

$ compgen -G "mydir/*.vmem"; echo $?
0

但是,我想知道为什么最初的尝试不起作用。我想学习 Bash,而不仅仅是让它工作并继续学习。我检查过:noglob 未设置。

更新 2

根据@Aaron,这应该(并且确实)适用于原始测试:

$ files=( mydir/*.vem )
$ [[ ${#files[@]} -gt 0 ]]; echo $?
0

这个版本实际上更容易在我的脚本函数中编写和理解(问题出现的地方)。整个脚本用于将 vmware 同步到时间机器卷上的备份文件夹。

使用 compgen

# get the status of a vm
# argument: path to the vm
# compgen exit code: 0 - path(s) found,1 - nothing found
function vm_status() {
  local vm_path="$1"
  local status=-1
  [[ $status -lt 0 ]] && { compgen -G "$vm_path/*.vmem" > /dev/null; }      || { status=0; }  # vm is shut down:  vm does not contain file with extension .vmem
  [[ $status -lt 0 ]] && { compgen -G "$vm_path/*.vmss" > /dev/null; }      && { status=1; }  # vm is suspended:  vm contains file with extension .vmss
  [[ $status -lt 0 ]] && { compgen -G "$vm_path/*.vmem.lck" > /dev/null; }  && { status=2; }  # vm is running:    vm contains folder name ending with .vmem.lck
  echo $status  # should return 0,1 or 2
}

compgen 不需要丢弃 [[ 输出

# get the status of a vm
# argument: path to the vm
function vm_status() {
  shopt -s nullglob # prevents non-matching glob from reporting one file (the glob itself)
  local vm_path="$1"
  local status=-1
  [[ $status -lt 0 ]] && { files=( "$vm_path"/*.vmem ); }      && [[ ${#files[@]} -gt 0 ]] || { status=0; }  # vm is shut down:  vm does not contain file with extension .vmem
  [[ $status -lt 0 ]] && { files=( "$vm_path"/*.vmss ); }      && [[ ${#files[@]} -gt 0 ]] && { status=1; }  # vm is suspended:  vm contains file with extension .vmss
  [[ $status -lt 0 ]] && { files=( "$vm_path"/*.vmem.lck ); }  && [[ ${#files[@]} -gt 0 ]] && { status=2; }  # vm is running:    vm contains folder name ending with .vmem.lck
  echo $status  # should return 0,1 or 2
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)