【感謝@Elliptic_Yang 的熱心翻譯。如果其他朋友也有不錯的原創或譯文,可以嘗試推薦給伯樂線上。】
我是一個Shell指令碼迷,也很喜歡從其他人的Shell指令碼里學習一些有趣的東西。最近我偶然接觸到用於方便ssh伺服器雙重認證的 authy-ssh 指令碼。 瀏覽指令碼後我學到了一些很酷的東西,在此也想分享給大家。
1. 讓你的echo豐富多彩
很多時候,你會想讓echo能以多種顏色區分不同輸出。比如,綠色表示成功,紅色告知失敗,黃色提示警告。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
NORMAL=$(tput sgr0) GREEN=$(tput setaf 2; tput bold) YELLOW=$(tput setaf 3) RED=$(tput setaf 1) function red() { echo -e "$RED$*$NORMAL" } function green() { echo -e "$GREEN$*$NORMAL" } function yellow() { echo -e "$YELLOW$*$NORMAL" } # To print success green "Task has been completed" # To print error red "The configuration file does not exist" # To print warning yellow "You have to use higher version." |
這裡使用 tput
來配置輸出顏色,輸出文字,最後再恢復預設輸出顏色。如果想對 tpu
瞭解更多,參看 prompt-color-using-tput 。
2. 輸出debug資訊
僅當設定DEBUG標誌時才列印除錯資訊。
1 2 3 4 5 6 7 8 9 |
function debug() { if [[ $DEBUG ]] then echo ">>> $*" fi } # For any debug message debug "Trying to find config file" |
還有來自於一些很酷的Geeks的單行debug函式:
1 2 |
function debug() { ((DEBUG)) && echo ">>> $*"; } function debug() { [ "$DEBUG" ] && echo ">>> $*"; } |
3. 檢查特定的可執行檔案是否存在
1 2 3 4 5 6 7 8 9 10 11 12 |
OK=0 FAIL=1 function require_curl() { which curl &>/dev/null if [ $? -eq 0 ] then return $OK fi return $FAIL } |
這裡使用 which
命令來查詢可執行檔案 curl
的路徑。如果成功找到,則可執行檔案檔案是存在的,否則就不存在。 &>/dev/null
將標準輸出和標準錯誤重定向到 /dv/null
(也就是不顯示在終端上了)。
一些朋友建議可以直接使用 which
返回的狀態碼。
1 2 3 |
# From cool geeks at hacker news function require_curl() { which "curl" &>/dev/null; } function require_curl() { which -s "curl"; } |
4. 顯示指令碼的使用說明
在我開始寫Shell指令碼的初期,常會使用 echo
命令顯示指令碼的使用說明。 但當說明的文字較多時,echo
語句就會變得一團糟。隨後我發現,可以使用 cat
命令來顯示使用說明。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
cat << EOF Usage: myscript <command> <arguments> VERSION: 1.0 Available Commands install - Install package uninstall - Uninstall package update - Update package list - List packages EOF |
這裡的
<<
稱為 here document,它可以將字串放置在兩個 EOF 之間。
5. 使用者設定 vs. 預設配置
我們有時會希望在使用者沒有提供設定引數時能夠使用預設值。
1 |
URL=${URL:-http://localhost:8080} |
這一語句檢查環境變數 URL ,如果不存在,就將其設定為 localhost
。
6. 檢查字串的長度
1 2 3 4 5 |
if [ ${#authy_api_key} != 32 ] then red "you have entered a wrong API key" return $FAIL fi |
${#VARIABLE_NAME}
可以給出字串的長度。
7. 為讀取輸入設定時限
1 2 3 4 5 6 7 8 |
READ_TIMEOUT=60 read -t "$READ_TIMEOUT" input # if you do not want quotes, then escape it input=$(sed "s/[;`\"\$\' ]//g" <<< $input) # For reading number, then you can escape other characters input=$(sed 's/[^0-9]*//g' <<< $input) |
8. 獲取目錄名和檔名
1 2 3 4 5 6 7 8 |
# To find base directory APP_ROOT=`dirname "$0"` # To find the file name filename=`basename "$filepath"` # To find the file name without extension filename=`basename "$filepath" .html` |
完結。 祝各位程式設計開心,享受這美好的一天吧!