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检查是否显示文件不存在?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 模版类和模板函数介绍及使用
- 下一篇: Linux iptables 防火墙相关