如果不匹配,Bash 扩展为空

如果不匹配,Bash 扩展为空

如果我运行这样的代码:

./script *.txt

*.txt将扩展到所有具有.txt扩展名的文件。但如果没有这样的文件,脚本将使用*.txt字符串调用。我想知道是否有办法在没有这样的文件时强制扩展为“”。因此,这意味着如果没有这样的文件,则将在不带任何参数的情况下调用脚本。

任何想法?

答案1

有几种方法可以做到这一点,具体取决于哪种方法方便且可行。

  • 如果您无法更改脚本,但它会以优雅的方式处理不获取参数的情况,则nullglob使用以下命令设置 shell 选项shopt -s nullglob在执行文件名通配操作并调用脚本的 shell 中。如果不匹配,这将导致模式被完全删除。 (请注意,该模式将不是被替换为空字符串,因为空字符串仍算作一个参数。)

  • 如果您无法更改脚本并且无法优雅地处理不获取任何参数的情况,请在执行文件名通配操作并调用脚本的 shell 中failglob使用设置 shell 选项。shopt -s failglob如果模式不匹配,这将导致 shell 发出错误,并且脚本将不是根本不会被召唤。

  • 如果你更改脚本,然后让它测试其第一个参数以[ -e "$1" ]查看它是否存在于文件系统中。如果存在,您就知道文件名通配模式已匹配某些内容。然后您可以像往常一样继续处理。否则,您可能会假设该模式与任何内容都不匹配(或者该脚本是在没有参数的情况下调用的,或者该模式与损坏的符号链接(以及可能的其他内容)匹配),并针对这种情况采取必要的操作。

    #!/bin/bash
    
    if ! [ -e "$1" ]; then
        # no files given
        exit 1
    fi
    
    # continue processing names from "$@"...
    
  • 与上一点类似,但在调用脚本之前进行测试:

    set -- *.txt
    [ -e "$1" ] && ./script "$@"
    

相关内容