Bash
從一個文件夾中查找所有shell腳本並按順序執行它們
我有一個包含很多 shell 腳本的文件夾來配置我的伺服器。
我的主腳本被命名為“setup.sh”,所有其他腳本被命名為 0.script.sh、1.script.sh…. 更一般地說是 N.SCRIPT_NAME.sh,其中 N 是執行編號。
所以,我想列出文件夾中的所有 shell 腳本,並按照 N 個數字指定的順序執行它們。
可能有一種更簡單的方法可以使用 zsh 按順序排列文件名,但這是 bash 中的一種蠻力方法:
for script in ?.script*.sh ??.script*.sh ???.script*.sh ????.script*.sh do printf "Executing script: %s\n" "$script" ./"$script" done
這假設您的腳本不超過 9999 個——或者更準確地說,在文件名的前綴部分中沒有超過 4 個數字(字元)的腳本。
它還假設前綴是編號的——如果你有一個,它會選擇名為的腳本,例如。
go.script_X.sh
要解決此問題,請將 替換?
為[0-9]
:for f in [0-9].script*.sh [0-9][0-9].script*.sh ...
shell 的自然通配機制是按字母順序對生成的文件名進行排序,這導致它們也按數字排序。各種文件名的拼寫比例越來越大,因此“9”排在“101”等之前。
在 zsh 中,按照前綴的數字順序將文件名全域化:
for script in *.script*.sh(oe_'REPLY=${REPLY%%.*}'_n) do printf "Executing script: %s\n" "$script" ./"$script" done
globbing 擴展首先獲取所有
*.script*.sh
文件,然後使用 xpressiono
對它們進行 rder(排序),該e
xpression 通過剝離盡可能多的“點後跟任何內容”並使用數字排序來提取前綴n
。