使用命令和glob“echo - ?”的shell可以和我应该期待什么行为?

时间:2014-02-07 18:26:29

标签: bash shell zsh glob

如果我想匹配名为“-f”或“-r”的文件,我可能会执行类似

的操作
test.sh -?

如果我想发送文字' - ?'作为一个参数的程序,我可能会做类似的事情:

test.sh -\?

如果没有这样的文件“-f”或“-r”或类似的东西,那么我的shell应该做什么

test.sh -?

它应该告诉我没有文件符合这种模式吗?

4 个答案:

答案 0 :(得分:2)

bash 中,默认设置是按字面意思处理不匹配的模式。如果设置了nullglob选项,则无法匹配的模式会“蒸发”;它将从命令中删除,甚至不会扩展为空字符串。

zsh 中,默认情况下,不匹配的模式会产生错误。设置nomatch选项会导致不匹配的模式按字面处理,zsh也支持nullglob选项,这会导致不匹配的模式消失。还有一个cshnullglob选项,其作用类似nullglob,但要求命令中至少有一个模式匹配,否则会产生错误。

请注意, POSIX 指定如果模式包含无效的括号表达式或与任何现有文件名或路径名不匹配,则模式字符串应在 sh 中保持不变。

ash,dash,ksh,bash和zsh在调用为sh时都会以这种方式运行。

答案 1 :(得分:2)

答案 2 :(得分:1)

您似乎在寻找nullglob选项,至少使用Bash:

shopt -s nullglob

如果没有nullglob选项,则会将不匹配的模式作为其文字self传递给您的程序:如果没有匹配的文件,shell会将-?传递给脚本。使用nullglob选项,无法匹配的模式将被替换为任何内容。

答案 3 :(得分:0)

如果不存在此类模式,则默认情况下,shell只返回您给出的模式,包括您使用的*?个字符。要确定文件是否确实存在,请对其进行测试。因此,在脚本中,使用:

[ -f "$1" ] ||  echo "no such file exists"