我有兩個 bash 陣列,其中包含一些字串,其中包含一些檔案及其目錄的名稱,并且我有一個包含這些檔案的目錄。我想創建一個條件,當字串陣列包含該目錄中的檔案時,該條件為真,但兩個檔案除外。
示例:我有一個dir包含 5 個檔案的目錄:file1、file2、file3、file1-suffix 和 file2-suffix。我有這個字串陣列:
files=("dir/file1" "dir/file2" "dir/file1-suffix" "anotherdir/file")
directories=$("dir" "anotherdir")
如果陣列包含任何沒有“-suffix”后綴的元素(在上面的示例檔案 1、檔案 2 和檔案 3 中),我想創建一個條件為真。在實際情況下,檔案的數量是任意大的,所以我不能為每個檔案做一個 If 陳述句。
由于它們都共享同一個目錄,我可以檢查一下,但是對于 -suffix 檔案,條件將是正確的,我不在乎那些。
現在我的情況是這樣的
if ( [[ " ${directories[*]} " =~ " ${DIRECTORY} " ]] && ! [[ " ${files[*]} " =~ '-suffix' ]] )
但是,在我的files陣列同時包含后綴和非后綴檔案的情況下,這個條件被評估為假,我希望它在這種情況下為真。
所以,總而言之,我想以一種“優雅”的方式獲得以下行為:
files=("dir/file1" "dir/file2")
條件為真。
files=("dir/file1" "dir/file1-suffix")
條件為真。
files=("dir/file1-suffix" "dir/file2-suffix")
條件為假。
files=("anotherdir/file1" "anotherdir/file2")
條件為假。
我還考慮將所有后綴檔案移動到不同的目錄,但如果可能的話,我寧愿避免使用該選項。這個問題有點棘手,如果我沒有說清楚,對不起。提前致謝。
uj5u.com熱心網友回復:
$DIRECTORY如果我正確地遵循了您的邏輯,則您想在洗掉任何不在其中的條目和任何匹配的條目后檢查陣列是否為非空-suffix。
matched=()
for item in "${files[@]}"; do
case $item in
*-suffix) continue;;
"$DIRECTORY"/*) ;;
*) continue;;
esac
# If you reach here, the condition is true already
matched =("$item")
done
回圈收集匹配的檔案matched;您可以在回圈后檢查交集是否包含任何元素,但如果您只關心集合中是否至少有一個檔案,您可以break退出回圈并在通過esac.
請注意我們如何注意正確參考任何陣列項。您的使用"${files[*]}"會盲目地認為一個名為is"otherdir or dir/file"的檔案dir顯然根本不正確。
如果您只想檢查一個目錄是否包含匹配項,那么使用陣列是完全沒有必要的,而且有點浪費。只需直接回圈目錄中的檔案即可。
for file in "$DIRECTORY"/*; do
case $file in *-suffix) continue;; esac
echo true
break
done
使用shopt -s extglob,您還可以簡單地檢查是否"$DIRECTORY"/!(*-suffix)擴展為一個或多個檔案:
shopt -s extglob # if it's not already enabled
shopt -s nullglob # expand to empty string if no match
for f in "$DIRECTORY"/!(*-suffix); do
echo true for "$f"
done
uj5u.com熱心網友回復:
如果陣列包含任何沒有“-suffix”后綴的元素
所以就這樣做吧。只需撰寫回圈,它遍歷一個陣列,不包括帶有 -suffix 的陣列,然后為另一個陣列的每個元素檢查它是否“包含”。
check_it() {
for f in "${files[@]}"; do
if [[ "$f" = *-suffix ]]; then continue; fi
for d in "${directories[@]}"; do
if [[ "$f" = "$d"/* ]]; then
return 0
fi
done
done
return 1
}
uj5u.com熱心網友回復:
如果您只想測驗索引陣列的任何元素files是否沒有-suffix后綴,您可以簡單地:
$ files=("dir/file1" "dir/file2" "dir/file1-suffix" "anotherdir/file")
$ if [[ "${files[*]%%*-suffix}" =~ ^\ *$ ]]; then echo no; else echo yes; fi
yes
$ files=("dir/file1-suffix" "dir/file2-suffix")
$ if [[ "${files[*]%%*-suffix}" =~ ^\ *$ ]]; then echo no; else echo yes; fi
no
我們只需用foo-suffix空字串替換任何元素,并檢查擴展為單個單詞的結果是否僅包含空格。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/455242.html
標籤:重击
