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

2d0f8d4f510adfd77e45c03c2fa3293f.png

倚天杖

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上,它们的内容是相同的(它们是同一文件的副本)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值