【问题标题】:shell script to check if a glob pattern matches any file [duplicate]用于检查 glob 模式是否与任何文件匹配的 shell 脚本 [重复]
【发布时间】:2017-11-14 18:32:09
【问题描述】:

我编写了一个 shell 脚本来检查是否存在二进制文件:

#!/usr/local/bin/bash

if [ -e "/path/to/a/binary/file/app.bin" ]; then 
     echo "INFO: application has been built successfully" 
else 
     echo "ERROR: application couldn't be built". 
fi

它工作正常并给出了预期的结果。但是,如果有许多具有相似名称的应用程序(例如 app1.bin, app2.bin 等)并且我想测试 "app*.bin",则 if 条件失败:

#!/usr/local/bin/bash

    if [ -e "/path/to/a/binary/file/app*.bin" ]; then 
         echo "INFO: application has been built successfully" 
    else 
         echo "ERROR: application couldn't be built". 
    fi

如何更正 if 条件以搜索以 app 为名称的任何二进制文件的存在,即 app*.bin

【问题讨论】:

  • glob 在引号内不起作用。即使您确实删除了它,如果从 glob 匹配返回多个文件,条件也会失败
  • 嗨@Inian,你有什么建议。我应该如何更改代码以解决我的目的。

标签: bash shell glob


【解决方案1】:

glob 匹配在引号内不起作用。即使您确实删除了它,如果从 glob 匹配返回多个文件,条件也会失败,因为 -e 仅适用于单个文件。

bash你可以这样做,

# the nullglob will let the unmatched glob to handled properly
shopt -s nullglob
fileList=(/path/to/a/binary/file/app*.bin)

if [ "${#fileList[@]}" -ge 1 ]; then
     echo "INFO: application has been built successfully" 
else
     echo "ERROR: application couldn't be built". 
fi

# This line is optional. This is just to ensure the nullglob option is 
# reset after our computation
shopt -u nullglob

【讨论】:

  • @F.Hauri:我的nullgob 选项设置正确(shopt -s nullglob )?
  • 哦,是的,对不起:我太快了……(我不使用nullglob)。使用-e 进行测试看起来既干净又高效。一般我尽量不使用shopt来防止强调试操作。
【解决方案2】:

另一种方法是使用compgen -G:它会生成一个匹配文件列表,或者如果没有任何匹配项,它将以错误状态退出。对于compgen,您需要引号来防止扩展。

if compgen -G "/path/to/a/binary/file/app*.bin" > /dev/null; then 
     echo "INFO: application has been built successfully" 
else 
     echo "ERROR: application couldn't be built". 
fi

【讨论】:

  • 感谢@Andrea,这是满足我要求的最简单的解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多