Bash 常用指令碼片段

捏造的信仰發表於2021-12-20

獲取一些常用變數:

# 獲取當前指令碼所在目錄
SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )

# 獲取當前指令碼的檔名
SCRIPT_NAME=$( basename "$0" )

# 在 $DIR 中搜尋第一個 jar 檔案的名字
JAR_FILE=$(find $DIR -maxdepth 1 -type f -name "*.jar" | head -1)

一些常用的判斷:

# 判斷變數是否為空
if [ -z "$VAR" ]; then
  echo "\$VAR is empty"
else
  echo "\$VAR is $VAR"
fi

# 判斷路徑是否存在
if [ -d "$PATH" ]; then
  echo "File $PATH exists"
else
  echo "File $PATH not found"
fi

# 判斷當前使用者是否是 root
if [ "${EUID:-$(id -u)}" -eq 0 ]; then
  do_root_stuff
fi

# 判斷 docker 命令能否執行
if ! command -v docker &> /dev/null; then
  echo "當前系統不能執行 docker 命令"
fi

根據程式啟動命令中的關鍵字搜尋程式ID

# set pid=$(get_pid "some-service-name")
get_pid() {
  SERVICE_NAME=$1
  PID=$(ps aux | grep "[${SERVICE_NAME:0:1}]${SERVICE_NAME:1}" | awk '{print $2}')
  echo "$PID"
}

解析並查詢命令列引數的通用方法

這段指令碼非常有用,你只要在你的指令碼開頭加上下面的內容,就能以 --param value 的格式解析引數。由於這段指令碼儘可能寫的短小不佔空間,所以格式方面會要求所有的引數都有值,例如不接受無引數的 --daemon,而必須傳 --daemon true

### 解析命令列引數
PARAMS_ARR=()
while (( "$#" )); do
    case "$1" in --*) PARAMS_ARR+=($1); shift;; *) PARAMS_ARR[-1]="${PARAMS_ARR[-1]} $1"; shift;; esac
done
### 獲取命令列引數,如果沒有則返回預設值
### 示例:value=$(get_param "param_name" "default_value")
function get_param {
    for param in "${PARAMS_ARR[@]}"; do if [[ $param =~ "--$1" ]]; then echo ${param#"--$1"} && return 0; fi done
    echo $2
}
### 獲取命令列引數,如果沒有則報錯退出(退出機制需要 set -e 來開啟,否則你就要自行處理返回值)
### 示例:value=$(get_param_required "param_name")
function get_param_required {
    for param in "${PARAMS_ARR[@]}"; do if [[ $param =~ "--$1" ]]; then echo ${param#"--$1"} && return 0; fi done
    echo -e "\e[31mParameter '$1' is required\e[m" >&2 && return 1
}
set -e

從上面的指令碼中解析引數值為陣列

如果引數值為多個,則可以用下面的語句提取成陣列:

# 假設要提取名為 PARAM_NAME 的引數值賦給陣列 ARR,可以用下面一行
IFS=', ' read -r -a ARR <<< $(get_param PARAM_NAME)
# 這裡多個引數值可以用逗號或空格隔開,例如 "--values a,b, c      d",
# 解析出來的陣列元素不會包含空白字元
# 檢查解析結果
echo "ARR size: ${#ARR[@]}"
echo "ARR content: ${ARR[@]}"

相關文章