第一次寫 shell script。
錯誤排除
如果沒辦法正常執行的話,試試看:
1 | chmod +x 檔名.sh |
接著再用 ls
查看訊息中是否有寫上 +x
的執行權限
語法
基本
#!
後面接著是要用什麼「解譯器」來解譯的意思。所以!#/bin/bash
的意思就是用 bash 這個解譯器來解譯。#
註解$0
shell script 的檔名echo $?
檢查上一行指令的執行狀況(Debug):0 代表正常,其他數字就代表不正常
運算
$((運算式))
做運算式的寫法。例如:1 + 1。沒有這樣寫的話會印出純文字
變數
$變數名稱
${變數名稱}
呼叫變數(請不要放在單引號內,不然會印出純文字)變數名稱=值
賦值。等號兩端不可以有空白,值如果有含空白要記得用「引號」包住unset 變數名稱
刪除變數
參數
$1
執行時傳入的參數,1 代表第一個,2 代表第二,以此類推$@
執行時傳入的所有參數
範例
1 | # 建立變數 |
用變數儲存指令的輸出值
例如說用 var=curl url
會發現變數沒辦法儲存回傳值。
如果變數要儲存的是「指令」的輸出結果,必須用 「`」 或是 $()
來包住:
1 | res=`curl --silent https://api.github.com/users/aszx87410` |
1 | res=$(curl --silent https://api.github.com/users/aszx87410) |
單引號跟反引號的差別
1 | cmd1="touch abc.txt" |
雙引號:使用雙引號表示的命令不會被立即執行,直到您使用
$
解析它時才會執行。例如,在上面的示例中,當您使用$cmd1
時,系統將執行touch abc.txt
命令。反引號:使用反引號表示的命令在定義時就會被立即執行,並將結果分配給變量。例如,在上面的示例中,當定義
cmd2
時,系統將執行touch cba.txt
命令,並將結果分配給cmd2
變量。因此您無需再使用$
解析變量,因為它已經在定義時執行。
簡單來說,如果希望在定義命令時就執行,您可以使用反引號;如果您希望在定義命令后才執行它,您可以使用雙引號。
sed -i 的用法
sed -i
是一個很有用的命令,可以在 shell 中快速修改文件。它使用正則表達式對文件進行替換,並且可以在原始文件上進行修改,因此您不需要重新創建一個新文件。
例如,假設您有一個名為 “example.txt” 的文件,內容如下:
1 | This is a line of text. |
如果您希望將所有的 “This” 替換為 “That”,您可以使用以下命令:
1 | sed -i '' 's/This/That/g' example.txt |
註一:sed -i
的 i
是代表我要直接對原本的檔案做修改,如果不加這個 flag 就會建立一個新的檔案。
註二:只有 Mac 用戶才需要加上第一個空字串,因為 Mac 的 sudo
加上 -i
以後第一個參數是 <extension>
,所以不加的話就會出問題。
該命令將執行正則表達式替換,並將原始文件 “example.txt” 替換為:
1 | That is a line of text. |
請注意,正則表達式的格式為:s/search_string/replace_string/g
,其中 g
表示對整個文件進行全局替換。
備註
其實這就很像是在寫另外一種程式語言而已,可以學的語法還有蠻多的,有興趣的話就參考下面的參考資料連結,都寫的蠻詳細的。