Bash
如果不匹配,Bash 擴展為空
如果我執行這樣的程式碼:
./script *.txt
*.txt
將擴展到所有具有.txt
副檔名的文件。但是如果沒有這樣的文件,腳本將用*.txt
字元串呼叫。我想知道是否有一種方法可以在沒有這樣的文件時強制擴展為“”。所以這意味著如果沒有這樣的文件,腳本將在沒有任何參數的情況下被呼叫。任何想法?
有幾種方法可以做到這一點,具體取決於方便和可行的方法。
- 如果您不能更改腳本,但它會以優雅的方式處理沒有參數的情況,則在執行文件名通配操作並呼叫腳本的 shell 中設置
nullglob
shell 選項。shopt -s nullglob
如果不匹配,這將導致模式被完全刪除。(請注意,模式不會被空字元串替換,因為空字元串仍算作一個參數。)- 如果您無法更改腳本,並且如果它無法正常處理沒有參數,則在執行文件名通配操作並呼叫腳本的 shell 中設置
failglob
shell 選項。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 "$@"