linux shell提示文件不存在,Bash检查是否显示文件不存在?

编程入门 行业动态 更新时间:2024-10-06 01:47:15

linux shell提示文件<a href=https://www.elefans.com/category/jswz/34/1770716.html style=不存在,Bash检查是否显示文件不存在?"/>

linux shell提示文件不存在,Bash检查是否显示文件不存在?

倚天杖

Martin Tournoij的答案和DevSolar的答案都提供了正确的解决方案和有用的背景信息:就[ ... ]一种情况而言,在另一种情况下[[ ... ]]。因为它可能不是很明显,如果当选择[[ ... ]]了[ ... ](和它的(虚拟)别名test ...),让我试图总结:如果您的代码必须是可移植的(兼容POSIX),则必须使用[ ... ](或test ...)。令牌里面[ ... ]被解析就像传递给一个可执行的参数,所以你必须用双引号你的变量引用,除非你明确地希望所有shell扩展-特别是分词(自动分裂成多个标记用空格)和通配符-适用于他们。[ -f "$stuff" ] # double-quoting required, if $stuff has embedded whitespace如果你知道你的代码将运行与bash,你可以使用[[ ... ]]的更多的功能和更少的惊喜。内部[[ ... ]]的令牌是在不应用单词拆分或路径名扩展(globbing)的特殊上下文中解析的(尽管确实发生了其他扩展,例如参数扩展),因此通常不需要双引号引用变量。[[ -f $stuff ]] # double-quoting optional请注意,ksh并zsh还支持[[ ... ]](可能与行为的微妙变化)。有关更多背景信息,例如所提供的其他功能[[ ... ]],请继续阅读。[[ ... ]]改进[ ... ]/ test ...如下:下面的“ RHS”表示“右侧”,即二进制运算符的右侧操作数。(通常)不要求引用变量引用(除了RHS的RHS ==并=~指定文字字符串或子字符串)f='some file'; [[ -f $f ]]  # ok, double quotes optionalv='*'; [[ $v == '*' ]]      # ok, double quotes optional既不对单词进行拆分,也不对路径名进行扩展[[ ... ]],因此对未嵌入引用的变量使用安全的引用是可行的,这些变量的值具有嵌入的空格和/或*通常会导致乱码的值。提供与/ 匹配的字符串模式,在RHS上带有未引用模式(或至少包含未引用模式元字符)。===v='a*'; [[ abc == "$v" ]] # does NOT match[[ abc == a* ]] && echo yes  # matches; use of = instead of == works too警告:因此,在=/ 的RHS上,==如果要将变量引用的值视为文字,则必须将其双引号(或单引号文字)。提供与匹配的=~正则表达式,并在RHS上带有未引用的扩展正则表达式(或至少包含未引用的regex metachars)。v='a.+'; [[ abc =~ ^"$v"$ ]] # does NOT match还要注意,未引号/引号的区别仅在bash 3.2中引入-您仍然可以shopt -s compat31将单引号和双引号的字符串也视为正则表达式。[[ abc =~ ^a.+$ ]] && echo yes  # matches警告:因此,在RHS上,=~如果要将变量引用的值视为文字,则必须将其双引号(或单引号文字)。注意事项:所理解的regex方言=~是特定于平台的,因此在一个平台上工作的regex可能在另一个平台上不工作(这是bash行为与平台有关的少数情况之一)。例如,在Linux上,您可以使用\b和\ \>进行单词边界断言,而BSD / macOS仅支持[[:]],而Linux不支持-参见我的回答。提供分组和否定与转义 (,)和!字符。提供and的使用&&||(布尔AND和OR)[[ (3 -gt 2) && ! -f / ]] && echo yes需要注意的是,内[[ ... ]],&&具有较高的比优先级||-与外部(如所谓的[命令- ]列表的运营商,在那里他们结合整个命令/命令列表),他们有相同的优先级。(在[和时test使用 -a和-o,甚至使用POSIX规范test以防使用)在中[[ ... ]],您可以将条件分布在多行中以提高可读性,而无需行继续符。(\),如codeforester指出的那样,假定换行符位于或之后&&||。[[ ... ]]是更快的比[ ... ],尽管这通常没有关系。如果您对相对性能感兴趣,请参阅我的答案。实现说明重新[和test:[[一个是壳关键字(在支持bash,ksh和zsh),其允许不同的解析规则,如上所述。相比之下,[并且test都内建在所有主要POSIX样弹(bash,ksh,zsh,dash)。此外,这两个[和test存在外部公用事业(可执行文件,需要一个单独的过程来调用),作为规定由POSIX。实际上,您需要外部实用程序版本才能使用[或test在“无外壳”调用方案中使用,例如将测试传递给find -exec或xargs。虽然[工具可以想见,作为一个符号链接的实现 test实用程序(只要test知道它是如何调用和执行的闭合]时的调用[),在实践中,他们往往(总是?)独立的可执行文件(真正的Linux和MacOS / BSD例如,在Linux上,它们的内容是不同的,而在macOS / BSD上,它们的内容是相同的(它们是同一文件的副本)。

更多推荐

linux shell提示文件不存在,Bash检查是否显示文件不存在?

本文发布于:2023-07-03 14:41:26,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1007813.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:不存在   文件   提示   linux   shell

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!