Shell-Script
將值添加到數組並基於該循環
我有 3 個文件,如下所示:
CV_REF_DATA_09012021.txt DB_ONLINE_CL_09012021.txt DFR_CL_INS_09012021.txt
我想檢查文件是否存在於 /NAS/CFG/ 中,然後將其添加到數組中。不需要所有 3 個文件始終都存在。因此,它可以是 1、2 或全部 3 個文件。如果沒有文件,腳本應該以同樣的方式退出。接下來我想基於數組循環並執行“呼叫”腳本。
呼叫腳本也使用文件模式來檢查文件計數。下面是呼叫腳本的程式碼。
NASFilecnt=`find . -type f -name "${CV_REF_DATA}*.txt" | wc -l`
那麼,如何根據上述執行循環。如果有任何疑問,請告訴我。
根據文件的存在,您對想要發生的事情的描述有點模糊。您是否希望為每個文件名前綴單獨或一起收集名稱也不清楚。例如,最好選擇一個特定的日期,然後嘗試從中找到一組文件。下面的程式碼應該為您的程式工作提供一些支持。
這個答案與我對您之前問題的回答類似,因為我們將遍歷一組靜態字元串以測試是否存在包含這些字元串的文件名。
您可以遍歷文件名前綴,並在每次迭代中檢查是否存在具有該前綴(和
.txt
文件名後綴)的任何文件。for prefix in CV_REF_DATA_ DB_ONLINE_CL_ DFR_CL_INS_; do set -- /NAS/CFG/"$prefix"*.txt if [ -e "$1" ]; then printf 'There exists names matching "%s"*.txt:\n' "$prefix" printf '\t%s\n' "$@" else printf 'No names matches "%s"*.txt\n' "$prefix" fi done
循環遍歷文件名前綴,並且在每次迭代中,我們嘗試擴展應該匹配我們對該前綴感興趣的文件的模式。該
set
命令會將匹配的文件名儲存在位置參數列表中("$@"
;"$1"
是該列表的第一個元素)。在
bash
shell 中,我們可以將上面的程式碼塊編寫如下。shopt -s nullglob for prefix in CV_REF_DATA_ DB_ONLINE_CL_ DFR_CL_INS_; do names=( /NAS/CFG/"$prefix"*.txt ) if [ "${#names[@]}" -gt 0 ]; then printf 'There exists names matching "%s"*.txt:\n' "$prefix" printf '\t%s\n' "${names[@]}" else printf 'No names matches "%s"*.txt\n' "$prefix" fi done
nullglob
shell 選項使不匹配的通配模式消失而不是保持未擴展。我們使用命名數組 ,names
在每次迭代中保存任何匹配的文件名。對於您的問題的字面解釋:如果目錄中至少存在一個樹文件名
CV_REF_DATA_09012021.txt
,DB_ONLINE_CL_09012021.txt
, 則呼叫其他腳本。將現有名稱添加到數組中。DFR_CL_INS_09012021.txt``/NAS/CFG
shopt -s nullglob unset -v names for name in CV_REF_DATA_09012021.txt DB_ONLINE_CL_09012021.txt DFR_CL_INS_09012021.txt do [ -e /NAS/CFG/"$name" ] && names+=( "$name" ) done if [ "${#names[@]}" -eq 0 ]; then echo 'no files could be found' >&2 exit 1 fi # At least one name is in the "names" array. # Call your other script below here.