Bash Shell 常用例子

定義一個數組,並打印出列表讓用戶選擇其中一個值:
# 定義:
projects=("svc-manager" "admin" "sms" "log-monitor")

# 列出projects中的所有值給用戶選擇,選擇結果存放在project變量中。PS3是系統提示語,默認值是"#?"
PS3="請選擇一個項目:"
select project in ${projects[*]};do
  if [ $project ];then
    break
  fi
done

定義一個map對象,並列出keys給用戶選擇:
# 定義:
declare -A projects=(["registry"]="註冊中心" ["user-service"]="用戶服務")

# 列出所有keys給用戶選擇,選擇結果存放在project中。PS3是系統提示語,默認值是"#?"
PS3="請選擇一個項目:"
select project in ${!projects[*]} "Exit(退出)";do
  if [ "$project" = "Exit(退出)" ]; then
    echo "謝謝使用!Good-Bye!"
    exit
  fi
  if [ $project ];then
    break
  fi
done

# 獲取被選擇的key的value:
project_name=${projects[$project]}

列出某個目錄中的所有文件,讓用戶選擇一個:
select file in ${backup_dir}/${project}/* ;do
  echo $file
done

開始運行腳本時加個鎖,避免兩個人同時運行:
#加鎖:
LOCKFILE="/opt/shell/spring-boot-deploy-git.lock"
#用 trap 命令設置一個對信號的監聽器
#程序運行中當監聽到信號 1,2,3,9,15 20就會刪除鎖文件,並退出腳本執行
#比如說,當腳本自行運行結束、被用戶 Ctrl+C 掉、被 Kill 掉、終端被關閉
#系統關機或重啓的情況下,都需將臨時文件刪除,否則腳本以後都沒機會執行
#運行 trap -l 查看到所以信號
trap 'echo "\n解鎖成功。";rm -f ${LOCKFILE}; exit' 1 2 3 9 15 20
if [ -f $LOCKFILE ]; then
  echo "另外一個人正在部署,請稍後再試!"
  echo "如果發生了異常,請清除鎖文件後再試:rm -f ${LOCKFILE}"
  exit 0
fi
touch $LOCKFILE #touch新建一個鎖文件
chmod 600 $LOCKFILE #把文件屬性改爲只建立者可讀寫

#在所有退出的地方解鎖:
echo 謝謝使用!
rm -f ${LOCKFILE}
exit

發生錯誤時自動重試:
echo 開始從git服務器的master分支中pull代碼...
git pull
while [ ! $? -eq 0 ];do#“$?”是上個命令的返回值,正常的話值是“0”
  echo "git pull 發生錯誤,自動重試……"
  git pull
done;

獲取當前時間並格式化:
today=$(date +%Y-%m-%d-%H-%M-%S)
echo $today

文本中使用製表符,並輸出到控制檯和文件(使用“-e”參數是製表符生效):
log_info="$(date +%Y-%m-%d/%H:%M:%S)\tgitVersion:$git_version\t$project_name($project)\tserver:"
echo -e $log_info
echo -e $log_info >> /opt/web/maven/$deploy_log_file

刪除字符串的最後一個字符:
log_info=${log_info::-1}
或如果知道最後那個字符是什麼(假設是“,”):
list=${list%","}

使用ssh執行遠端服務器的命令行:
#重啓遠端服務器的某個service:
/usr/bin/ssh -l root -p $ssh_port $target_ip "systemctl restart ${project}.service"

使用ssh拷貝本地文件到遠端服務器:
# rsync方式:
/usr/bin/rsync -avzuP -e "ssh -p $ssh_port" target/$project.jar $target_ip:$spring_boot_dir/
# scp方式:
/usr/bin/scp -P $ssh_port $file $target_ip:$spring_boot_dir/$project.jar

布爾變量的定義和使用:
need_backup=true
if [ "$need_backup" == true ];then
  # do sth...
fi

提示“按任意鍵繼續”:
read -s -n1 -p "按任意鍵繼續……"

提示用戶輸入“y/n”並獲取結果:
# 提示輸入“y/n”,結果保存到變量needbackup中:
while [[ ! $needbackup =~ ^[yn]$ ]];do
  read -e -p "是否備份:(y/n)?" -i "y" needbackup
done
# 或:
while [ "$confirm" != "y" ] && [ "$confirm" != "n" ] ;do
  read -e -p "以上信息是否正確?(y/n)?" -i "y" confirm
done

倒計時:
seconds_left=10
echo "倒計時${seconds_left}秒開始……"
while [ $seconds_left -gt 0 ];do
  echo -n $seconds_left
  sleep 1
  seconds_left=$(($seconds_left - 1)) #變量減一
  echo -ne "\r \r" #清除本行文字
  # do some other thing,比如等待某個進程退出結束...
done

獲取某個端口的pid:
pid=`netstat -nlp | grep $port | awk '{print $7}' | awk -F "/" '{print $1}'`
echo $pid

根據關鍵字找到相關進程的id:
process_keywords="/opt/app/tomcat/bin"
for pid in `ps -ef|grep $process_keywords|grep -v 'grep'|awk '{print $2}'`
do
  echo $pid
done

執行命令行的結果不輸出到控制檯(使用:&>/dev/null &):
rm -f $2/logs/*.log &>/dev/null &
gzip * &>/dev/null &
/bin/sh $2/bin/startup.sh &>/dev/null &

根據日誌文件判斷某個進程是否已經完全啓動(比如tomcat):
echo -n "請耐心等待tomcat完全啓動……"
while [ ! "$started" ];do
  sleep 1
  # 根據log中是否出現"Server startup in [0-9]* ms"關鍵字來判斷:
  started=$(grep "Server startup in [0-9]* ms" $2/logs/catalina.out)
  echo -n "…"
done
echo "tomcat已經完全啓動。"





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章