iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0

Shell script

在現代軟體開發和系統管理中,Shell 腳本(Shell Script)是一個極為重要的工具。它們允許我們自動化任務,簡化工作流程,並以更有效率的方式處理各種任務
今天我將介紹 Shell 腳本的基礎語法。
而在後面兩天我會分別介紹如何使用shell script寫迴圈與條件式,並在再隔一天後使用shell script配合openai以在terminal模擬使用chatGPT

註解

提供說明和文檔的特殊行,這些行不會被 Shell執行,僅用於幫助理解腳本的功能和行為。
註解在代碼中起到了關鍵的解釋和記錄作用,使代碼更容易讀取和維護。

# 註解以`#`開頭,後面跟著註解文字
<< EOF
使用EOF接收註釋行
這是第二行
EOF

: << EOF
也可以使用冒號後面接空格使得再加上雙引號
或使用EOF來實現多行註解
PS. 冒號後面加空格為空命令
EOF

Shebang Line

  • Shell 腳本的第一行通常包含一個特殊的註釋,用來指定要使用的 Shell。
  • 語法:#!/path/to/interpreter
  • 對於確保腳本的可移植性和可重用性非常重要
  • 若未指定則預設以$SHELL作為運行的shell
  • 注意: 不要跟註解搞混
#!/this/is/shebang/string
# this is comment

執行指令

直接像在terminal中打指令就行

command

print

輸出內容,等價於其他程式語言的print()
E.G. 使用shell script 實作 Hello world

#!/bin/bash
echo "Hello World"

要一次print多行可以用cat配合將多行字串丟到stdin

cat << STDIN
this will apply for the string between two 
    "STDIN" OR whatever you named it
    
Shell will put thest text into stdin
and uses cat to print these text
STDIN

input

輸入內容,等價於python的input()或其他程式語言的readline()

read Input # 將接下來輸入的值傳給Input變數

變數設定

  • 宣告變數: KEY=VALUE
  • 獲取變數值: $KEY
    如果要將變數應用於字串的話一定只能用雙引號或反引號將變數包起,因為單引號通常為了避免特殊符號被解釋而使用
  • 宣告Array: `arr=(some element that separate by a space)
    • 獲取第n個元素(0-index): ${arr[n]}
  • 存取指令運行結果:var=$(command)
  • 設定環境變數:export KEY=VALUE

退出程式

一般用於指定是否因為錯誤而退出

exit [exit code]

運算相關

基本語法: $(( expression ))
預設是直接捨去小數點,因此無法處理小數。若要計算小數需配合nc使用

$ echo | 'scale=n;((expression))'
  • 可用運算符如下
    • + - * /: 加減乘除
    • %: 取餘數
    • var++ var--: 指定變數後將變數加或減1
    • ++var --var: 將變數加或減1後指定變數
    • ! ~: 位元/邏輯 反轉
    • << >>: 位元位移
    • **: 計算次方
    • & |: 對數值做位元 或/與 運算
    • && ||: 邏輯 或/與
    • expr ? exprTrue : exprFalse: 三元運算子

shell parameter expansion

之所以把這個單獨拿出來講是因為這個能講得真的太多了,總之是一種用來操作變數值的方法,其基本形式是${parameter},其中 parameter 是一個 shell 變數或一個陣列參考。

  • 參數擴展可以有不同的運算子,用來修改參數的值或提供參數的資訊。
  • shell參數相關:
    • $#: 傳給shell的參數數量
    • $?: 上一個指令的狀態碼(exit code)
      • 0為正常結束,其他值代表錯誤
    • $$: 獲取目前process ID
    • $<n>: 獲取第n個參數值(n=0代表獲取指令名稱)
    • $*: 所有參數
  • 字串相關

    str=string

    • ${#str}: 獲取字串長度
    • ${#str:offset:[length]"}: 切割字串
      • offset: 起始位置
      • length: 取幾個字

      length可為負數(-k): 代表結束位置往前k位

      $ echo ${str:2:3} # 等價於echo ${str:2:-1}` 
      rin
      
    • 刪除子字串
      postfix=ing
      prefix=str 
      pattern=rin 
      replace=ron
      
      • ${str%postfix}: 刪除後綴
      • ${str#prefix}: 刪除前綴
      • ${str/pattern[/replace]}: 刪除符合
        • 使用/replace以取代而非刪除
        $ echo ${str/$pattern/$replace}
        strong
        
      • ${str}

REF

https://zhuanlan.zhihu.com/p/54494213
https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
https://www.cyut.edu.tw/~ywfan/1109linux/201109chapter11shell%20script.htm
https://myapollo.com.tw/blog/bash-parameter-expansion/


上一篇
Day15: 配置Vim的config檔
下一篇
Day17: shell script中的for迴圈
系列文
I Use Linux BTW: 談Linux與其指令30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言