Bash

從一個文件夾中查找所有shell腳本並按順序執行它們

  • November 16, 2018

我有一個包含很多 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(排序),該expression 通過剝離盡可能多的“點後跟任何內容”並使用數字排序來提取前綴n

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