Bash

如果不匹配,Bash 擴展為空

  • November 25, 2022

如果我執行這樣的程式碼:

./script *.txt

*.txt將擴展到所有具有.txt副檔名的文件。但是如果沒有這樣的文件,腳本將用*.txt字元串呼叫。我想知道是否有一種方法可以在沒有這樣的文件時強制擴展為“”。所以這意味著如果沒有這樣的文件,腳本將在沒有任何參數的情況下被呼叫。

任何想法?

有幾種方法可以做到這一點,具體取決於方便和可行的方法。

  • 如果您不能更改腳本,但它會以優雅的方式處理沒有參數的情況,則在執行文件名通配操作並呼叫腳本的 shell 中設置nullglobshell 選項。shopt -s nullglob如果不匹配,這將導致模式被完全刪除。(請注意,模式不會被空字元串替換,因為空字元串仍算作一個參數。)
  • 如果您無法更改腳本,並且如果它無法正常處理沒有參數,則在執行文件名通配操作並呼叫腳本的 shell 中設置failglobshell 選項。shopt -s failglob如果模式不匹配,這將導致 shell 發出錯誤,並且根本不會呼叫腳本。
  • 如果您可以更改腳本,則讓它測試它的第一個參數[ -e "$1" ]以查看它是否存在於文件系統中。如果它存在,你就知道文件名 globbing 模式匹配了一些東西。然後您可以繼續照常處理。否則,您可能會假設該模式不匹配任何內容(或者呼叫腳本時不帶參數,或者模式匹配損壞的符號連結(以及可能的其他內容))並針對此場景採取必要的操作。
#!/bin/bash

if ! [ -e "$1" ]; then
   # no files given
   exit 1
fi

# continue processing names from "$@"...
  • 與上一點類似,但在呼叫腳本之前進行測試:
set -- *.txt
[ -e "$1" ] && ./script "$@"

引用自:https://unix.stackexchange.com/questions/726199