我的第一個 Shell Script

第一次寫 shell script。

錯誤排除

如果沒辦法正常執行的話,試試看:

1
chmod +x 檔名.sh

接著再用 ls 查看訊息中是否有寫上 +x 的執行權限

語法

基本

  • #! 後面接著是要用什麼「解譯器」來解譯的意思。所以 !#/bin/bash 的意思就是用 bash 這個解譯器來解譯。
  • # 註解
  • $0 shell script 的檔名
  • echo $? 檢查上一行指令的執行狀況(Debug):0 代表正常,其他數字就代表不正常

運算

  • $((運算式)) 做運算式的寫法。例如:1 + 1。沒有這樣寫的話會印出純文字

變數

  • $變數名稱 ${變數名稱} 呼叫變數(請不要放在單引號內,不然會印出純文字)
  • 變數名稱=值 賦值。等號兩端不可以有空白,值如果有含空白要記得用「引號」包住
  • unset 變數名稱 刪除變數

參數

  • $1 執行時傳入的參數,1 代表第一個,2 代表第二,以此類推
  • $@ 執行時傳入的所有參數

範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 建立變數
name="Jim"
# 建立變數 + 賦值
n=10
m=5
echo 運算結果:$((n+$m))
# 檢查上一行指令
echo "查看指令是否正常執行:$?"
# 呼叫變數
echo "呼叫變數 name:${name}"
echo "呼叫變數 name:$name"
# 刪除變數
unset name
echo "刪除後再呼叫變數 name:${name}"
# 參數
echo "檔名:$0"
echo "參數1:$1"
echo "參數2:$2"
echo "所有參數:$@"
echo "所有參數(無間隔):$*"

用變數儲存指令的輸出值

例如說用 var=curl url 會發現變數沒辦法儲存回傳值。

如果變數要儲存的是「指令」的輸出結果,必須用 「`」 或是 $() 來包住:

1
2
res=`curl --silent https://api.github.com/users/aszx87410`
echo $res
1
2
res=$(curl --silent https://api.github.com/users/aszx87410)
echo $res

單引號跟反引號的差別

1
2
3
4
5
cmd1="touch abc.txt"
cmd2=`touch cba.txt`

$cmd1
$cmd2
  • 雙引號:使用雙引號表示的命令不會被立即執行,直到您使用 $ 解析它時才會執行。例如,在上面的示例中,當您使用 $cmd1 時,系統將執行 touch abc.txt 命令。

  • 反引號:使用反引號表示的命令在定義時就會被立即執行,並將結果分配給變量。例如,在上面的示例中,當定義 cmd2 時,系統將執行 touch cba.txt 命令,並將結果分配給 cmd2 變量。因此您無需再使用 $ 解析變量,因為它已經在定義時執行。

簡單來說,如果希望在定義命令時就執行,您可以使用反引號;如果您希望在定義命令后才執行它,您可以使用雙引號。

sed -i 的用法

sed -i 是一個很有用的命令,可以在 shell 中快速修改文件。它使用正則表達式對文件進行替換,並且可以在原始文件上進行修改,因此您不需要重新創建一個新文件。

例如,假設您有一個名為 “example.txt” 的文件,內容如下:

1
2
This is a line of text.
This is another line of text.

如果您希望將所有的 “This” 替換為 “That”,您可以使用以下命令:

1
sed -i '' 's/This/That/g' example.txt

註一:sed -ii 是代表我要直接對原本的檔案做修改,如果不加這個 flag 就會建立一個新的檔案。
註二:只有 Mac 用戶才需要加上第一個空字串,因為 Mac 的 sudo 加上 -i 以後第一個參數是 <extension>,所以不加的話就會出問題。

該命令將執行正則表達式替換,並將原始文件 “example.txt” 替換為:

1
2
That is a line of text.
That is another line of text.

請注意,正則表達式的格式為:s/search_string/replace_string/g,其中 g 表示對整個文件進行全局替換。

備註

其實這就很像是在寫另外一種程式語言而已,可以學的語法還有蠻多的,有興趣的話就參考下面的參考資料連結,都寫的蠻詳細的。

參考資料

Shell Script 簡易筆記
簡明 Linux Shell Script 入門教學

很有趣的位移運算子與位元運算 mentor-program-day05
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×