Shell Script

Shell CLI 達成 HMAC SHA256 加密

科技進步是來自於偷懶,前陣子小編剛好有投資點加密貨幣,但某些固定的操作讓人心煩。就寫了個小shell腳本自動進行買賣還有交易。但中間OKX(過去原名OKEX)API 腳本中有一段需要將產生ACCESS SIGN才能操做,苦惱了我一陣子。因為網路上寫python特別多,找到 shell 相關腳本的相較少。

Raspberry PI PPPoE 撥號完成後自動更新 Google 動態 DNS

網域在 Google domains 上購買有提供 DNS 代管服務,本網站的主機是使用樹梅派架設 LEMP,對外中華電信光纖上網只有一個固定IP,使用浮動IP來對外服務每72小時就會中斷一次。

要確保網站可以提供長期服務,當偵測到IP有所變化就會自動更新主機位置給 Google 的動態 DNS,讓全世界的人都可以正確地連入 Server 。

SC2129 當多行重新定向寫入文件時考慮使用{cmd1; cmd2; } >>文件,而不是單行寫入。

有問題的代碼:

echo foo >> file 
date >> file 
cat stuff  >> file

正確的代碼:

{
echo foo
date
cat stuff
} >> file

理由:

用 {} 把所有要重新定向的內容進行分組,一次性的導入 “>> file” 文件中,此寫法有兩點優勢。
第一讓代碼更簡化不用每行添加 “>> file” 進行寫入文件,第二文件只需打開及關閉一次,這代表的執行性能被提高了。

例外情況:

此問題僅僅是寫作風格的不同,需要忽略此提示也可以。

參考來源:

SC2126 建議使用 grep -c代替 grep | wc

錯誤代碼:

grep foo | wc -l

正確代碼:

grep -c foo

對於多個文件

錯誤代碼:

grep foo * .log | wc -l

正確代碼:

cat * .log | grep foo -c

修正原因:

這單純是一種程式編碼上風格問題,因 grep 可以直接進行計算無須再次利用管道方式傳送至 wc 進行運算。

檢查有無符合的匹配項目,在沒有符合的項目時(參數值==0),此情形下使用 grep -q 甚至更加清晰及高效率,例如下列示範:

if grep -q pattern file; then
   echo "此文件有符合的項目"
fi

當如果執行 foo | grep bar | wc -l,在正常情形下無法顯示 grep 執行時的異常訊息,並且始終顯示執行成功,錯誤排除時難以查找問題。如果替換成 foo | grep -c bar 則在沒有匹配項目時退出會顯示 0 。

例外狀況:

如果在特定情形下 wc 指令可以使結果更清楚,就可以忽略此寫法。

參考來源:

SC2028 echo 不會轉義特殊字元應使用 printf。

錯誤代碼:

echo "Name:\t$value"

正確代碼:

printf 'Name:\t%s\n' "$value"

修正原因:

特殊字元像是 \t 或是 \n 並不會被 echo 轉義成特殊字元,而會如實的列印出字面上的 \t 及 \n。但 printf 會確實的解析此類型的特殊字元,應改變使用習慣。

部分Linux 支援像是使用 echo -e ‘\t’ 和 echo$’\t’。但為了共通性應該避免使用,

printf 確實會擴展這些序列,應改為使用。如果在 VS code 中撰寫shell 腳本開頭宣告#!/bin/sh , ShellCheck 套件也會發出此警告。

如果您確實需要字面反斜線-t,請使用

echo "\\t"

例外狀況:

參考來源:

取得當前 shell Script 路徑及檔名

利用此參數是在某些大量部屬的內部及特定的外部環境中,沒有辦法使用 Github 來做定期排程的 Shell Script 控管,而需要定期排程執行的事情越來越多,於是就在思考是否可以透過簡單的 Web Server 提供版本的 HASH 值,計算本地檔案並比較 hash 值來是否有需要更新 shell Script。

返回頂端