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已经完全启动。"

其他shell常用命令: http://blog.csdn.net/clementad/article/details/46793827




你可能感兴趣的:(Linux,精品)