如果我运行这样的代码:
./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 "$@"