#如何在Bash shell腳本中創建函數

我在寫一個shell腳本來自動化我在工作流程中的事情,以便發布書籍。

我一直在手動操作,通常我很懶,我會重複做同樣的事情,直到自動化,但今天我必須完成一個非常重複的任務,我希望能做對事情,所以我決定寫一個腳本來幫助我和未來的我。

所以我寫了一個腳本,它要進入不同的文件夾並且需要三次調用npx來執行某些操作,就像這樣:

#!/bin/sh

cd c-handbook

npx honkit pdf ./ ../books/$(basename $PWD).pdf
npx honkit epub ./ ../books/$(basename $PWD).epub
npx honkit mobi ./ ../books/$(basename $PWD).mobi

cd ..



cd css-handbook 

npx honkit pdf ./ ../books/$(basename $PWD).pdf
npx honkit epub ./ ../books/$(basename $PWD).epub
npx honkit mobi ./ ../books/$(basename $PWD).mobi

cd ..

npx部分的操作都是相同的。

所以我把所有的npx調用封裝到一個函數中,然後我只需調用該函數,像這樣:

#!/bin/sh

generate\_book () {
 npx honkit pdf ./ ../books/$(basename $PWD).pdf
 npx honkit epub ./ ../books/$(basename $PWD).epub
 npx honkit mobi ./ ../books/$(basename $PWD).mobi
}

cd c-handbook
generate\_book
cd ..

cd css-handbook 
generate\_book
cd ..

然後我在這期間決定創建一個包含所有書本文件夾的數組:

books=( "c-handbook" "css-handbook" "deno-handbook" "es5-to-next" "express-handbook" "html-handbook" "javascript-beginner-handbook" "linux-commands-handbook" "nextjs-handbook" "node-handbook" "python-handbook" "react-beginner-handbook" "svelte-handbook" "vue-handbook" )

並且使用循環迭代這個數組:

for i in "${books[@]}"
do
 : 
 echo $i
 cd $i
 generate\_book
 cd ..
done

最終版本:

#!/bin/sh

books=( "c-handbook" "css-handbook" "deno-handbook" "es5-to-next" "express-handbook" "html-handbook" "javascript-beginner-handbook" "linux-commands-handbook" "nextjs-handbook" "node-handbook" "python-handbook" "react-beginner-handbook" "svelte-handbook" "vue-handbook" )

generate\_book () {
 npx honkit pdf ./ ../books/$(basename $PWD).pdf
 npx honkit epub ./ ../books/$(basename $PWD).epub
 npx honkit mobi ./ ../books/$(basename $PWD).mobi
}

for i in "${books[@]}"
do
 : 
 echo $i
 cd $i
 generate\_book
 cd ..
done