带有命令和 glob "echo -?"的 shell 可以并且应该期望什么行为?



如果我想匹配一个名为"-f"或"-r"的文件,我可以做类似的事情

test.sh -?

如果我想将文字"-?"作为参数发送到程序,我可能会执行以下操作:

test.sh -?

如果没有这样的文件"-f"或"-r"或类似的东西存在,那么我的外壳应该怎么做

test.sh -?

它应该告诉我没有与此模式匹配的文件吗?

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

zsh中,不匹配的模式默认会产生错误。设置 nomatch 选项会导致从字面上处理不匹配的模式,并且zsh还支持导致不匹配模式消失的nullglob选项。还有一个cshnullglob选项,它的作用类似于nullglob,但需要命令中至少有一个模式才能匹配,否则会产生错误。

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

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

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

ashdashkshbashzsh在作为sh调用时都是这样行为的。

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

shopt -s nullglob

如果没有 nullglob 选项,不匹配的模式将作为其文字自身传递给您的程序:如果没有匹配的文件,shell 将-?传递给脚本。 使用nullglob选项,不匹配的模式将完全替换为任何模式。

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

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

相关内容

  • 没有找到相关文章