shell 接收长参数

以备份 mysql 脚本为例,如下

bash 复制代码
#!/bin/bash
# 分隔符
str="-"

# 定义分割线函数
FenGeLine() {
	## 获取屏幕宽度
	ScreenLen=$(stty size |awk '{print $2}')

	## 标题宽度
	TitleLen=$(echo -n $1 |wc -c)
	#echo $TitleLen
	## 左右分割线长度
	LineLen=$(((${ScreenLen} - ${TitleLen})/2))        # 一半长度,标题居中。

    if [ ${LineLen} -gt 0 ];then
        #echo $LineLen
	    # 打印分割线
	    yes ${str} |sed ''''${LineLen}'''q' |tr -d "\n" && echo -n $1 && yes ${str} |sed ''''${LineLen}'''q' |tr -d "\n" && echo
    else
        echo "$1"
    fi

}

# 定义短选项和长选项
SHORT_OPTS="h"
LONG_OPTS="help,host:,user:,port:,password:,db:,backfile:,"

# 解析命令行选项
PARSED_OPTS=$(getopt -o $SHORT_OPTS -l $LONG_OPTS -- "$@")
if [[ $? -ne 0 ]]; then
  exit 1
fi

# 将解析结果设置为位置参数
eval set -- "$PARSED_OPTS"



# 处理选项
while true; do
  case "$1" in
    -h|--help)
      echo "Usage: $0 [options]"
      echo "  -h, --help      Show help"
      echo "  --host connect mysql ip address"
      echo "  --user connect mysql user"
      echo "  --port connect mysql port"
      echo "  --password connect mysql password"
      echo "  --db backup mysql database"
      echo "  --backfile backup file"
      shift
      exit 0
      ;;
    --host)
      host="$2"
      shift 2
      ;;
    --user)
      user="$2"
      shift 2
      ;;
    --port)
      port="$2"
      shift 2
      ;;
    --password)
      password="$2"
      shift 2
      ;;
    --db)
      db="$2"
      shift 2
      ;;
    --backfile)
      backfile="$2"
      shift 2
      ;;
    --)
      shift
      break
      ;;
    *)
      echo "Invalid option: $1"
      exit 1
      ;;
  esac
done
host=${host:-localhost}
user=${user:-root}
port=${port:-3306}
password=${password:-123456}
backfile=${backfile:-/opt/mysql-${db}.sql}

FenGeLine "host 默认值为 localhost"
FenGeLine "user 默认值为 root"

FenGeLine "port 默认值为 3306"
FenGeLine "password 默认值为 123456"
FenGeLine "backfile 默认值为 /opt/mysql${db}.sql}"

FenGeLine "传入的 host 为 $host"
FenGeLine "传入的 user 为 $user"
FenGeLine "传入的 port 为 $port"
FenGeLine "传入的 password 为 $password"
FenGeLine "传入的 db 为 $db"
FenGeLine "传入的 backfile 为 $backfile"

if [ -z "$db" ];then
mysqldump  -h$host -u$user -P$port -p$password -A > $backfile
else
mysqldump  -h$host -u$user -P$port -p$password -B $db > $backfile
fi
相关推荐
且从容.1 小时前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落3 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨3 小时前
WSL2的安装与使用
linux·wsl
微小的鱼3 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng3 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮4 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
Linux-lucky16 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu
禁默16 小时前
启元 Q1 二次开发实践:Ubuntu 部署与仿真验证,从 PrimeConsole 到 ROS 2 Humble + RViz
linux·运维·ubuntu
skywalk816317 小时前
把 去也网站 从 Ubuntu 搬到 FreeBSD:一次 Service Jail + nginx 的部署实录
linux·运维·nginx·ubuntu·freebsd
爱莉希雅&&&19 小时前
GitLab 完整学习笔记
linux·运维·服务器