Case3:通过read传参实现自定义输入内容和颜色plus_color.sh

18 篇文章 ¥29.90 ¥99.00
本文介绍了如何使用read命令从用户那里接收参数,以实现自定义输入内容和颜色的功能。通过一个名为plus_color.sh的脚本,用户可以定制显示的信息及其颜色效果。

通过read传参实现自定义输入内容和颜色plus_color.sh

#!/bin/bash
RED_COLOR='\E[1;31m'
GREEN_COLOR='\E[1;32m'
YELLOW_COLOR='\E[1;33m'
BLUE_COLOR='\E[1;34m'
PINK='\E[1;35m'
RES='\E[0m'
if [ $# -ne 2 ]
  then 
  echo "USAGE $0 content {red|yellow|blue|green}"
  exit 
fi
case "$2" in
  red|RED)
   echo -e "$RED_COLOR $1 $RES"
   ;;
  green|GREEN)
    echo -e "$GREEN_COLOR $1 $RES "
    ;;
  yellow|YELLOW)
   echo -e "$YELLOW_COLOR $1 $RES"
   ;;
  *)
   echo "USAGE $0 content {red|yellow|blue|green}"
   exit
   ;;
esac

测试 
sh plus_color.sh apple red

报错如下,请修改并给出完整代码 Running with gitlab-runner 16.11.1 (535ced5f) on simple-messanger-pipeline Dh8vcrz-, system ID: s_b55713b166da Preparing the "docker" executor 00:00 Using Docker executor with image hw-checker-template ... Using docker image sha256:8bbfa814aae65fb16f5b2efad5602a114836f8d70fe2f9ba014ca239d2c3c9bc for hw-checker-template ... Preparing environment 00:01 Running on runner-dh8vcrz--project-26475-concurrent-0 via fhm17a5j7169uek44nqk... Getting source from Git repository 00:01 Fetching changes with git depth set to 50... Initialized empty Git repository in /home/builds/1/Curiosity/.git/ Created fresh repository. Checking out 55a10c8c as detached HEAD (ref is refs/merge-requests/1/head)... Skipping Git submodules setup Executing "step_script" stage of the job script 00:01 Using docker image sha256:8bbfa814aae65fb16f5b2efad5602a114836f8d70fe2f9ba014ca239d2c3c9bc for hw-checker-template ... $ cp -r /simple-messanger-tests $GIT_CLONE_PATH; cd simple-messanger-tests $ bash build +++ Removing old junit reports from: /home/builds/1/Curiosity/simple-messanger-tests/results name is: compile_test_clang class is: build +++ Running case: build.compile_test_clang +++ working dir: /home/builds/1/Curiosity/simple-messanger-tests +++ command: ./compile_test_clang.sh 1>&2 clang++ server.cpp -std=c++17 -g -O3 -Werror -Wall -Wextra -pthread -pedantic -o server server.cpp:35:21: error: variable length arrays are a C99 feature [-Werror,-Wvla-extension] char message[BUFFER_SIZE + nickname_size + 10]; ^ server.cpp:54:14: error: unused variable 'portno' [-Werror,-Wunused-variable] uint16_t portno = (uint16_t)atoi(argv[1]); ^ 2 errors generated. Makefile:6: recipe for target 'all' failed make: *** [all] Error 1 FAIL +++ exit code: 1 +++ error: 1 name is: compile_test_gcc class is: build +++ Running case: build.compile_test_gcc +++ working dir: /home/builds/1/Curiosity/simple-messanger-tests +++ command: ./compile_test_gcc.sh 1>&2 g++ server.cpp -std=c++17 -g -O3 -Werror -Wall -Wextra -pthread -pedantic -o server server.cpp: In function 'void* handle_client(void*)': server.cpp:35:54: error: ISO C++ forbids variable length array 'message' [-Werror=vla] char message[BUFFER_SIZE + nickname_size + 10]; ^ server.cpp: In function 'int main(int, char**)': server.cpp:54:14: error: unused variable 'portno' [-Werror=unused-variable] uint16_t portno = (uint16_t)atoi(argv[1]); ^~~~~~ server.cpp: In function 'void* handle_client(void*)': server.cpp:17:9: error: ignoring return value of 'ssize_t read(int, void*, size_t)', declared with attribute warn_unused_result [-Werror=unused-result] read(client_sockfd, &nickname_size_net, sizeof(nickname_size_net)); ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ server.cpp:20:9: error: ignoring return value of 'ssize_t read(int, void*, size_t)', declared with attribute warn_unused_result [-Werror=unused-result] read(client_sockfd, nickname, nickname_size); ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ server.cpp:32:13: error: ignoring return value of 'ssize_t read(int, void*, size_t)', declared with attribute warn_unused_result [-Werror=unused-result] read(client_sockfd, buffer, body_size); ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ cc1plus: all warnings being treated as errors Makefile:6: recipe for target 'all' failed make: *** [all] Error 1 FAIL +++ exit code: 1 +++ error: 1 Uploading artifacts for failed job 00:01 Uploading artifacts... results/TEST-build.xml: found 1 matching artifact files and directories Uploading artifacts as "junit" to coordinator... 201 Created id=321039 responseStatus=201 Created token=D2ehKyxr Cleaning up project directory and file based variables 00:00 ERROR: Job failed: exit code 1
10-21
#!/bin/bash echo "=== M20 设备配置菜单 ===" echo "" echo "请选择操作:" echo "1) 修改wifi名称" echo "2) 修改编号(MFI.toml)" echo "3) 修改设备型号 (HWI.toml)" echo "4) 安装版本包" echo "5) 设置硬件时间" echo "6) 显示三个主机时间" echo "7) 执行完整主机安装流程" echo "8) 显示软件版本" echo "9) 执行一键标定" echo "10) 执行一键标零" echo "11) ros导航菜单" echo "12) 组件命令测试菜单" echo "13) ros导航输出菜单" echo "14) 脚本使用说明" echo "15) 删除脚本" echo "16) 重启系统" echo "17) 退出" echo "" # 配置变量 config_file="/var/opt/robot/conf/HWI.toml" backup_file="${config_file}.bak.$(date +%Y%m%d_%H%M%S)" HOST_NAME_FILE="/var/opt/robot/conf/host_name" MFI_CONFIG_FILE="/var/opt/robot/conf/MFI.toml" target_dir="/var/opt/robot" calibration_dir="/opt/robot/bin" # 网络配置 HOST_103="10.21.31.103" HOST_104="10.21.31.104" HOST_106="10.21.31.106" SSH_USER="user" SSH_TIMEOUT=15 # 软件包配置 PACKAGE_103="CA9B_103_2509261327.debs" PACKAGE_104="CA9B_104_2509261327.debs" PACKAGE_106="CA9B_106_2509261327.debs" RELEASE_NOTE="release_note.json" # 日志文件 LOG_FILE="/tmp/m20_config_$(date +%Y%m%d_%H%M%S).log" # 日志记录函数 log_info() { echo "[$(date &#39;+%Y-%m-%d %H:%M:%S&#39;)] INFO: $1" | tee -a "$LOG_FILE" } log_error() { echo "[$(date &#39;+%Y-%m-%d %H:%M:%S&#39;)] ERROR: $1" | tee -a "$LOG_FILE" } log_warn() { echo "[$(date &#39;+%Y-%m-%d %H:%M:%S&#39;)] WARN: $1" | tee -a "$LOG_FILE" } # 时间同步函数 sync_time_to_host() { local host_ip="$1" local host_name="$2" local time_str="$3" log_info "开始同步时间到 $host_name ($host_ip)" echo "正在同步到 $host_name ($host_ip)..." if ssh -t -o ConnectTimeout="$SSH_TIMEOUT" -o StrictHostKeyChecking=no "$SSH_USER@$host_ip" "sudo date -s &#39;$time_str&#39; && sudo hwclock -w" 2>>"$LOG_FILE"; then echo "✓ $host_name 时间同步成功" log_info "$host_name 时间同步成功" return 0 else echo "✗ $host_name 时间同步失败" log_error "$host_name 时间同步失败" return 1 fi } # 初始化日志 echo "=== M20 设备配置脚本启动 ===" > "$LOG_FILE" log_info "脚本启动,版本: v2.1" # 检查权限 if [ "$EUID" -ne 0 ]; then log_error "权限不足,需要sudo权限" echo "错误: 请使用sudo运行此脚本" exit 1 fi # 检查配置文件 if [ ! -f "$config_file" ]; then log_error "配置文件不存在: $config_file" echo "错误: 配置文件 $config_file 不存在!" exit 1 fi # 检查必要目录 if [ ! -d "$target_dir" ]; then log_warn "目标目录不存在,尝试创建: $target_dir" mkdir -p "$target_dir" || { log_error "无法创建目录: $target_dir" echo "错误: 无法创建目录 $target_dir" exit 1 } fi log_info "初始化检查完成,日志文件: $LOG_FILE" while true; do read -p "请输入选项 (1-17): " choice case $choice in 1) echo "执行: 修改wifi名称" echo "" echo "配置 host_name 文件中的狗编号..." if [ ! -f "$HOST_NAME_FILE" ]; then echo "警告:文件 $HOST_NAME_FILE 不存在,跳过狗编号配置" else echo "当前 host_name 文件内容:" head -n 1 "$HOST_NAME_FILE" read -p "请输入狗的编号: " dog_number if [[ ! "$dog_number" =~ ^[0-9]+$ ]]; then echo "错误:请输入有效的数字编号" else echo "正在修改狗编号为: $dog_number" sudo sed -i "1s/CA9B_NO\.[0-9]*/CA9B_NO.$dog_number/" "$HOST_NAME_FILE" || { echo "修改文件失败" continue } # 触发 inotify,同步机制 sudo touch "$HOST_NAME_FILE" echo "✓ 狗编号修改成功!" echo "修改后第一行内容:$(head -n 1 "$HOST_NAME_FILE")" fi fi echo "" echo "配置完成!系统需要重启以使配置生效。" echo "⚠️ 警告: 系统将在5秒后自动重启" echo "按 Ctrl+C 可以取消重启" for i in {5..1}; do echo "重启倒计时: $i 秒..." sleep 1 done echo "正在重启系统..." sudo reboot ;; 2) echo "执行: 配置编号" log_info "开始配置MFI.toml编号" if [ ! -f "$MFI_CONFIG_FILE" ]; then log_error "MFI配置文件不存在: $MFI_CONFIG_FILE" echo "✗ 错误: 配置文件 $MFI_CONFIG_FILE 不存在" continue fi cd "$(dirname "$MFI_CONFIG_FILE")" chmod +w "$(basename "$MFI_CONFIG_FILE")" read -p "请输入批次号 (lot_id): " lot_id read -p "请输入序列号 (sn): " sn # 创建备份 cp "$(basename "$MFI_CONFIG_FILE")" "$(basename "$MFI_CONFIG_FILE").bak.$(date +%Y%m%d_%H%M%S)" sed -i "s/^lot_id=\"[^\"]*\"/lot_id=\"$lot_id\"/" "$(basename "$MFI_CONFIG_FILE")" sed -i "s/^sn=\"[^\"]*\"/sn=\"$sn\"/" "$(basename "$MFI_CONFIG_FILE")" if [ $? -eq 0 ]; then echo "✓ MFI.toml 配置完成" log_info "MFI.toml配置成功: lot_id=$lot_id, sn=$sn" echo "当前MFI.toml配置:" cat "$(basename "$MFI_CONFIG_FILE")" else echo "✗ MFI.toml 配置失败" log_error "MFI.toml配置失败" fi ;; 3) echo "执行: 修改设备型号" echo "正在创建备份: $backup_file" cp "$config_file" "$backup_file" chmod +w "$config_file" echo "当前第5行内容:" sed -n &#39;5p&#39; "$config_file" echo "" echo "请选择设备型号:" echo "1) 山猫M20 (STD)" echo "2) 山猫M20 Pro (PRO)" read -p "请输入选择 (1或2): " device_choice case $device_choice in 1) new_value="STD" ;; 2) new_value="PRO" ;; *) echo "✗ 无效选择"; continue ;; esac sed -i "5s/type[[:space:]]*=[[:space:]]*\"[^\"]*\"/type = \"$new_value\"/" "$config_file" if [ $? -eq 0 ]; then echo "✓ 设备型号修改成功" echo "修改后内容:" sed -n &#39;5p&#39; "$config_file" else echo "✗ 修改失败" cp "$backup_file" "$config_file" fi ;; 4) echo "执行: 安装版本包" echo "========================================" echo "第一条命令: 切换到软件包安装目录" echo "1) cd $target_dir" cd "$target_dir" if [ $? -eq 0 ]; then echo "✓ 已切换到 $target_dir 目录" echo "当前目录: $(pwd)" log_info "成功切换到安装目录: $target_dir" else echo "✗ 切换目录失败" log_error "切换目录失败: $target_dir" continue fi echo "" echo "第二条命令: 执行软件包安装" echo "2) sudo bash $PACKAGE_103" if [ -f "$PACKAGE_103" ]; then echo "正在执行大包安装..." log_info "开始安装软件包: $PACKAGE_103" sudo bash "$PACKAGE_103" if [ $? -eq 0 ]; then echo "✓ 软件包安装完成" log_info "软件包安装成功: $PACKAGE_103" else echo "✗ 软件包安装失败" log_error "软件包安装失败: $PACKAGE_103" fi else echo "✗ 安装包文件 $PACKAGE_103 不存在" echo "请确认文件是否在 $target_dir 目录中" log_error "安装包文件不存在: $PACKAGE_103" fi ;; 5) echo "执行: 设置硬件时间" echo "========================================" # 输入时间 echo "请按格式输入时间 (YYYY-MM-DD HH:MM:SS)" echo "例如: 2025-08-20 11:11:15" read -p "输入时间: " input_time # 验证时间格式 if ! date -d "$input_time" >/dev/null 2>&1; then echo "✗ 时间格式错误,请重新输入" continue fi # 设置本地主机103时间 echo "" echo "步骤1: 设置主机103时间" echo "----------------------------------------" sudo date -s "$input_time" && sudo hwclock -w if [ $? -eq 0 ]; then echo "✓ 主机103时间设置成功" current_time=$(date &#39;+%Y-%m-%d %H:%M:%S&#39;) echo "当前时间: $current_time" else echo "✗ 主机103时间设置失败" continue fi # 同步到远程主机 echo "" echo "步骤2: 同步时间到远程主机" echo "----------------------------------------" echo "请输入SSH密码,然后输入sudo密码" # 同步到104主机 sync_time_to_host "$HOST_104" "主机104" "$current_time" # 同步到106主机 echo "" sync_time_to_host "$HOST_106" "主机106" "$current_time" echo "" echo "========================================" echo "✓ 时间设置完成" ;; 6) echo "执行: 显示三个主机时间" echo "正在查询三个主机的当前时间..." echo "========================================" # 显示本地主机103时间 echo "" echo "主机103 (10.21.31.103) 当前时间:" echo "----------------------------------------" echo "系统时间: $(date)" echo "硬件时钟: $(sudo hwclock)" echo "✓ 主机103 时间信息获取成功" # 定义远程主机 remote_hosts=("$HOST_104" "$HOST_106") host_names=("主机104" "主机106") for i in "${!remote_hosts[@]}"; do echo "" echo "${host_names[$i]} (${remote_hosts[$i]}) 当前时间:" echo "----------------------------------------" # 尝试获取远程主机时间 if timeout 10 ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$SSH_USER@${remote_hosts[$i]}" "echo &#39;系统时间: &#39;\$(date) && echo &#39;硬件时钟: &#39;\$(sudo hwclock 2>/dev/null || echo &#39;获取失败&#39;)" 2>>"$LOG_FILE"; then echo "✓ ${host_names[$i]} 时间信息获取成功" log_info "${host_names[$i]} 时间信息获取成功" else echo "✗ ${host_names[$i]} 连接失败或时间信息获取失败" echo " 请检查网络连接SSH服务状态" log_error "${host_names[$i]} 连接失败" fi done echo "" echo "========================================" echo "✓ 三个主机时间查询完成" ;; 7) echo "执行: 完整主机安装流程" echo "========================================" echo "将按顺序执行以下步骤:" echo "1. 设置硬件时间" echo "2. 修改编号(MFI.toml)" echo "3. 修改设备型号(HWI.toml)" echo "4. 复制版本包文件" echo "5. 安装版本包" echo "" echo "请选择操作:" echo "1) 开始安装" echo "2) 退出" echo "" read -p "请输入选择 (1或2): " confirm_install case $confirm_install in 1) echo "开始执行完整安装流程..." ;; 2) echo "已取消完整安装流程" continue ;; *) echo "无效选择,已取消安装流程" continue ;; esac echo "" echo "========== 步骤1: 设置硬件时间 ==========" # 输入时间 echo "请按格式输入时间 (YYYY-MM-DD HH:MM:SS)" echo "例如: 2025-08-20 11:11:15" read -p "输入时间: " input_time # 验证时间格式 if ! date -d "$input_time" >/dev/null 2>&1; then echo "✗ 时间格式错误,安装流程中断" continue fi # 设置本地主机103时间 echo "设置主机103时间..." sudo date -s "$input_time" && sudo hwclock -w if [ $? -eq 0 ]; then echo "✓ 主机103时间设置成功" current_time=$(date &#39;+%Y-%m-%d %H:%M:%S&#39;) echo "当前时间: $current_time" else echo "✗ 主机103时间设置失败,安装流程中断" continue fi # 同步到远程主机 echo "同步时间到远程主机..." ssh -t -o ConnectTimeout=15 -o StrictHostKeyChecking=no user@10.21.31.104 "sudo date -s &#39;$current_time&#39; && sudo hwclock -w && echo &#39;✓ 主机104 时间同步成功&#39; || echo &#39;✗ 主机104 时间同步失败&#39;" ssh -t -o ConnectTimeout=15 -o StrictHostKeyChecking=no user@10.21.31.106 "sudo date -s &#39;$current_time&#39; && sudo hwclock -w && echo &#39;✓ 主机106 时间同步成功&#39; || echo &#39;✗ 主机106 时间同步失败&#39;" echo "" echo "========== 步骤2: 修改编号(MFI.toml) ==========" cd /var/opt/robot/conf/ chmod +w MFI.toml read -p "请输入批次号 (lot_id): " lot_id read -p "请输入序列号 (sn): " sn sed -i "s/^lot_id=\"[^\"]*\"/lot_id=\"$lot_id\"/" MFI.toml sed -i "s/^sn=\"[^\"]*\"/sn=\"$sn\"/" MFI.toml if [ $? -eq 0 ]; then echo "✓ MFI.toml 配置完成" echo "当前MFI.toml配置:" cat MFI.toml else echo "✗ MFI.toml 配置失败,但继续执行后续步骤" fi echo "" echo "========== 步骤3: 修改设备型号(HWI.toml) ==========" echo "正在创建备份: $backup_file" cp "$config_file" "$backup_file" chmod +w "$config_file" echo "当前第5行内容:" sed -n &#39;5p&#39; "$config_file" echo "" echo "请选择设备型号:" echo "1) STD" echo "2) PRO" read -p "请输入选择 (1或2): " device_choice case $device_choice in 1) new_value="STD" ;; 2) new_value="PRO" ;; *) echo "无效选择,使用默认STD"; new_value="STD" ;; esac sed -i "5s/type[[:space:]]*=[[:space:]]*\"[^\"]*\"/type = \"$new_value\"/" "$config_file" if [ $? -eq 0 ]; then echo "✓ 设备型号修改成功" echo "修改后内容:" sed -n &#39;5p&#39; "$config_file" else echo "✗ 设备型号修改失败,但继续执行后续步骤" fi echo "" echo "========== 步骤4: 复制版本包文件 ==========" echo "正在复制软件包release_note文件到/var/opt/robot目录..." sudo cp CA9B_103_2509261327.debs CA9B_104_2509261327.debs CA9B_106_2509261327.debs release_note.json /var/opt/robot/ if [ $? -eq 0 ]; then echo "✓ 版本包文件复制完成" echo "已复制文件:" echo " - CA9B_103_2509261327.debs" echo " - CA9B_104_2509261327.debs" echo " - CA9B_106_2509261327.debs" echo " - release_note.json" else echo "✗ 版本包文件复制失败,但继续执行后续步骤" fi echo "" echo "========== 步骤5: 安装版本包 ==========" echo "切换到软件包安装目录..." cd /var/opt/robot/ if [ $? -eq 0 ]; then echo "✓ 已切换到 /var/opt/robot/ 目录" else echo "✗ 切换目录失败,安装流程中断" continue fi echo "执行软件包安装..." if [ -f "CA9B_103_2509261327.debs" ]; then echo "正在执行大包安装..." sudo bash CA9B_103_2509261327.debs if [ $? -eq 0 ]; then echo "✓ 软件包安装完成" else echo "✗ 软件包安装失败" fi else echo "✗ 安装包文件 CA9B_103_2509261327.debs 不存在" fi echo "" echo "========================================" echo "✓ 完整主机安装流程执行完成" echo "请检查上述步骤的执行结果" ;; 8) echo "执行: 显示软件版本并检查合规性" echo "正在查询三个主机的软件版本信息并与标准版本对比..." echo "========================================" # 版本检查函数 check_host_103() { local version_output="$1" echo "" echo "主机103 (10.21.31.103) 软件版本检查:" echo "----------------------------------------" # 解析版本输出到关联数组 declare -A actual_versions while IFS= read -r line; do if [[ -n "$line" ]]; then package=$(echo "$line" | awk &#39;{print $1}&#39;) version=$(echo "$line" | awk &#39;{print $2}&#39;) actual_versions["$package"]="$version" fi done <<< "$version_output" # 检查103主机的期望版本 local all_correct=true # 检查basic_server if [[ "${actual_versions[basic_server]:-}" == "1.2.36" ]]; then echo "✓ basic_server: ${actual_versions[basic_server]} (正确)" else echo "✗ basic_server: ${actual_versions[basic_server]:-未安装} (期望: 1.2.36)" all_correct=false fi # 检查boardresources if [[ "${actual_versions[boardresources]:-}" == "1.1.8" ]]; then echo "✓ boardresources: ${actual_versions[boardresources]} (正确)" else echo "✗ boardresources: ${actual_versions[boardresources]:-未安装} (期望: 1.1.8)" all_correct=false fi # 检查drdds-ros2-msgs if [[ "${actual_versions[drdds-ros2-msgs]:-}" == "1.0.1" ]]; then echo "✓ drdds-ros2-msgs: ${actual_versions[drdds-ros2-msgs]} (正确)" else echo "✗ drdds-ros2-msgs: ${actual_versions[drdds-ros2-msgs]:-未安装} (期望: 1.0.1)" all_correct=false fi # 检查drddslib if [[ "${actual_versions[drddslib]:-}" == "1.1.0" ]]; then echo "✓ drddslib: ${actual_versions[drddslib]} (正确)" else echo "✗ drddslib: ${actual_versions[drddslib]:-未安装} (期望: 1.1.0)" all_correct=false fi # 检查ecan-master if [[ "${actual_versions[ecan-master]:-}" == "2.1.1" ]]; then echo "✓ ecan-master: ${actual_versions[ecan-master]} (正确)" else echo "✗ ecan-master: ${actual_versions[ecan-master]:-未安装} (期望: 2.1.1)" all_correct=false fi # 检查height_map_nav if [[ "${actual_versions[height_map_nav]:-}" == "1.0.4" ]]; then echo "✓ height_map_nav: ${actual_versions[height_map_nav]} (正确)" else echo "✗ height_map_nav: ${actual_versions[height_map_nav]:-未安装} (期望: 1.0.4)" all_correct=false fi # 检查lio_perception if [[ "${actual_versions[lio_perception]:-}" == "1.0.10" ]]; then echo "✓ lio_perception: ${actual_versions[lio_perception]} (正确)" else echo "✗ lio_perception: ${actual_versions[lio_perception]:-未安装} (期望: 1.0.10)" all_correct=false fi # 检查log4cplus-dev if [[ "${actual_versions[log4cplus-dev]:-}" == "2.0.41" ]]; then echo "✓ log4cplus-dev: ${actual_versions[log4cplus-dev]} (正确)" else echo "✗ log4cplus-dev: ${actual_versions[log4cplus-dev]:-未安装} (期望: 2.0.41)" all_correct=false fi # 检查mcu_update if [[ "${actual_versions[mcu_update]:-}" == "1.0.3" ]]; then echo "✓ mcu_update: ${actual_versions[mcu_update]} (正确)" else echo "✗ mcu_update: ${actual_versions[mcu_update]:-未安装} (期望: 1.0.3)" all_correct=false fi # 检查node_driver if [[ "${actual_versions[node_driver]:-}" == "1.1.8" ]]; then echo "✓ node_driver: ${actual_versions[node_driver]} (正确)" else echo "✗ node_driver: ${actual_versions[node_driver]:-未安装} (期望: 1.1.8)" all_correct=false fi # 检查rl_deploy if [[ "${actual_versions[rl_deploy]:-}" == "1.4.6" ]]; then echo "✓ rl_deploy: ${actual_versions[rl_deploy]} (正确)" else echo "✗ rl_deploy: ${actual_versions[rl_deploy]:-未安装} (期望: 1.4.6)" all_correct=false fi # 检查robot_common_lib if [[ "${actual_versions[robot_common_lib]:-}" == "1.0.0" ]]; then echo "✓ robot_common_lib: ${actual_versions[robot_common_lib]} (正确)" else echo "✗ robot_common_lib: ${actual_versions[robot_common_lib]:-未安装} (期望: 1.0.0)" all_correct=false fi echo "----------------------------------------" if $all_correct; then echo "✓ 主机103 所有软件版本正确" else echo "✗ 主机103 存在版本不匹配或未安装的软件" fi } check_host_104() { local version_output="$1" echo "" echo "主机104 (10.21.31.104) 软件版本检查:" echo "----------------------------------------" # 解析版本输出到关联数组 declare -A actual_versions while IFS= read -r line; do if [[ -n "$line" ]]; then package=$(echo "$line" | awk &#39;{print $1}&#39;) version=$(echo "$line" | awk &#39;{print $2}&#39;) actual_versions["$package"]="$version" fi done <<< "$version_output" # 检查104主机的期望版本 local all_correct=true # 检查boardresources if [[ "${actual_versions[boardresources]:-}" == "1.1.8" ]]; then echo "✓ boardresources: ${actual_versions[boardresources]} (正确)" else echo "✗ boardresources: ${actual_versions[boardresources]:-未安装} (期望: 1.1.8)" all_correct=false fi # 检查drdds-ros2-msgs if [[ "${actual_versions[drdds-ros2-msgs]:-}" == "1.0.1" ]]; then echo "✓ drdds-ros2-msgs: ${actual_versions[drdds-ros2-msgs]} (正确)" else echo "✗ drdds-ros2-msgs: ${actual_versions[drdds-ros2-msgs]:-未安装} (期望: 1.0.1)" all_correct=false fi # 检查drddslib if [[ "${actual_versions[drddslib]:-}" == "1.1.0" ]]; then echo "✓ drddslib: ${actual_versions[drddslib]} (正确)" else echo "✗ drddslib: ${actual_versions[drddslib]:-未安装} (期望: 1.1.0)" all_correct=false fi # 检查log4cplus-dev if [[ "${actual_versions[log4cplus-dev]:-}" == "2.0.41" ]]; then echo "✓ log4cplus-dev: ${actual_versions[log4cplus-dev]} (正确)" else echo "✗ log4cplus-dev: ${actual_versions[log4cplus-dev]:-未安装} (期望: 2.0.41)" all_correct=false fi # 检查node_driver if [[ "${actual_versions[node_driver]:-}" == "1.1.8" ]]; then echo "✓ node_driver: ${actual_versions[node_driver]} (正确)" else echo "✗ node_driver: ${actual_versions[node_driver]:-未安装} (期望: 1.1.8)" all_correct=false fi # 检查robot_common_lib if [[ "${actual_versions[robot_common_lib]:-}" == "1.0.0" ]]; then echo "✓ robot_common_lib: ${actual_versions[robot_common_lib]} (正确)" else echo "✗ robot_common_lib: ${actual_versions[robot_common_lib]:-未安装} (期望: 1.0.0)" all_correct=false fi echo "----------------------------------------" if $all_correct; then echo "✓ 主机104 所有软件版本正确" else echo "✗ 主机104 存在版本不匹配或未安装的软件" fi } check_host_106() { local version_output="$1" echo "" echo "主机106 (10.21.31.106) 软件版本检查:" echo "----------------------------------------" # 解析版本输出到关联数组 declare -A actual_versions while IFS= read -r line; do if [[ -n "$line" ]]; then package=$(echo "$line" | awk &#39;{print $1}&#39;) version=$(echo "$line" | awk &#39;{print $2}&#39;) actual_versions["$package"]="$version" fi done <<< "$version_output" # 检查106主机的期望版本 local all_correct=true # 检查boardresources if [[ "${actual_versions[boardresources]:-}" == "1.1.8" ]]; then echo "✓ boardresources: ${actual_versions[boardresources]} (正确)" else echo "✗ boardresources: ${actual_versions[boardresources]:-未安装} (期望: 1.1.8)" all_correct=false fi # 检查charge-manager if [[ "${actual_versions[charge-manager]:-}" == "4.0.25" ]]; then echo "✓ charge-manager: ${actual_versions[charge-manager]} (正确)" else echo "✗ charge-manager: ${actual_versions[charge-manager]:-未安装} (期望: 4.0.25)" all_correct=false fi # 检查drdds-ros2-msgs if [[ "${actual_versions[drdds-ros2-msgs]:-}" == "1.0.1" ]]; then echo "✓ drdds-ros2-msgs: ${actual_versions[drdds-ros2-msgs]} (正确)" else echo "✗ drdds-ros2-msgs: ${actual_versions[drdds-ros2-msgs]:-未安装} (期望: 1.0.1)" all_correct=false fi # 检查drddslib if [[ "${actual_versions[drddslib]:-}" == "1.1.0" ]]; then echo "✓ drddslib: ${actual_versions[drddslib]} (正确)" else echo "✗ drddslib: ${actual_versions[drddslib]:-未安装} (期望: 1.1.0)" all_correct=false fi # 检查handler if [[ "${actual_versions[handler]:-}" == "1.0.6" ]]; then echo "✓ handler: ${actual_versions[handler]} (正确)" else echo "✗ handler: ${actual_versions[handler]:-未安装} (期望: 1.0.6)" all_correct=false fi # 检查localization if [[ "${actual_versions[localization]:-}" == "3.2.3" ]]; then echo "✓ localization: ${actual_versions[localization]} (正确)" else echo "✗ localization: ${actual_versions[localization]:-未安装} (期望: 3.2.3)" all_correct=false fi # 检查log4cplus-dev if [[ "${actual_versions[log4cplus-dev]:-}" == "2.0.41" ]]; then echo "✓ log4cplus-dev: ${actual_versions[log4cplus-dev]} (正确)" else echo "✗ log4cplus-dev: ${actual_versions[log4cplus-dev]:-未安装} (期望: 2.0.41)" all_correct=false fi # 检查node_driver if [[ "${actual_versions[node_driver]:-}" == "1.1.6" ]]; then echo "✓ node_driver: ${actual_versions[node_driver]} (正确)" else echo "✗ node_driver: ${actual_versions[node_driver]:-未安装} (期望: 1.1.6)" all_correct=false fi # 检查planner if [[ "${actual_versions[planner]:-}" == "2.0.6" ]]; then echo "✓ planner: ${actual_versions[planner]} (正确)" else echo "✗ planner: ${actual_versions[planner]:-未安装} (期望: 2.0.6)" all_correct=false fi # 检查robot_common_lib if [[ "${actual_versions[robot_common_lib]:-}" == "1.0.0" ]]; then echo "✓ robot_common_lib: ${actual_versions[robot_common_lib]} (正确)" else echo "✗ robot_common_lib: ${actual_versions[robot_common_lib]:-未安装} (期望: 1.0.0)" all_correct=false fi # 检查slam if [[ "${actual_versions[slam]:-}" == "3.1.1" ]]; then echo "✓ slam: ${actual_versions[slam]} (正确)" else echo "✗ slam: ${actual_versions[slam]:-未安装} (期望: 3.1.1)" all_correct=false fi echo "----------------------------------------" if $all_correct; then echo "✓ 主机106 所有软件版本正确" else echo "✗ 主机106 存在版本不匹配或未安装的软件" fi } # 检查主机103版本 echo "" echo "正在检查主机103版本..." # 获取当前主机IP来判断是否为本地主机 current_ip=$(hostname -I | awk &#39;{print $1}&#39; 2>/dev/null || echo "") if [[ "$current_ip" == "10.21.31.103" ]]; then # 当前就是103主机,直接获取本地版本 local_version_output=$(dpkg -l | grep -e &#39;built using CMake&#39; -e &#39;log4cplus&#39; | awk &#39;{print $2, $3}&#39; | column -t 2>/dev/null || echo "") else # 当前不是103主机,通过SSH获取103主机版本 local_version_output=$(ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user@10.21.31.103 "dpkg -l | grep -e &#39;built using CMake&#39; -e &#39;log4cplus&#39; | awk &#39;{print \$2, \$3}&#39; | column -t" 2>/dev/null || echo "") fi if [[ -n "$local_version_output" ]]; then check_host_103 "$local_version_output" else echo "" echo "主机103 (10.21.31.103) 软件版本检查:" echo "----------------------------------------" echo "✗ 主机103 无法获取版本信息" echo " 请检查网络连接SSH服务状态" fi # 检查主机104版本 echo "" echo "正在检查主机104版本..." if [[ "$current_ip" == "10.21.31.104" ]]; then # 当前就是104主机,直接获取本地版本 remote_version_output_104=$(dpkg -l | grep -e &#39;built using CMake&#39; -e &#39;log4cplus&#39; | awk &#39;{print $2, $3}&#39; | column -t 2>/dev/null || echo "") else # 当前不是104主机,通过SSH获取104主机版本 remote_version_output_104=$(ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user@10.21.31.104 "dpkg -l | grep -e &#39;built using CMake&#39; -e &#39;log4cplus&#39; | awk &#39;{print \$2, \$3}&#39; | column -t" 2>/dev/null || echo "") fi if [[ -n "$remote_version_output_104" ]]; then check_host_104 "$remote_version_output_104" else echo "" echo "主机104 (10.21.31.104) 软件版本检查:" echo "----------------------------------------" echo "✗ 主机104 连接失败或无法获取版本信息" echo " 请检查网络连接SSH服务状态" fi # 检查主机106版本 echo "" echo "正在检查主机106版本..." if [[ "$current_ip" == "10.21.31.106" ]]; then # 当前就是106主机,直接获取本地版本 remote_version_output_106=$(dpkg -l | grep -e &#39;built using CMake&#39; -e &#39;log4cplus&#39; | awk &#39;{print $2, $3}&#39; | column -t 2>/dev/null || echo "") else # 当前不是106主机,通过SSH获取106主机版本 remote_version_output_106=$(ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user@10.21.31.106 "dpkg -l | grep -e &#39;built using CMake&#39; -e &#39;log4cplus&#39; | awk &#39;{print \$2, \$3}&#39; | column -t" 2>/dev/null || echo "") fi if [[ -n "$remote_version_output_106" ]]; then check_host_106 "$remote_version_output_106" else echo "" echo "主机106 (10.21.31.106) 软件版本检查:" echo "----------------------------------------" echo "✗ 主机106 连接失败或无法获取版本信息" echo " 请检查网络连接SSH服务状态" fi # 检查是否所有主机版本都正确 all_hosts_correct=true # 检查本地主机103版本结果 if [[ -n "$local_version_output" ]]; then # 这里需要重新检查103的版本是否全部正确 declare -A actual_versions_103 while IFS= read -r line; do if [[ -n "$line" ]]; then package=$(echo "$line" | awk &#39;{print $1}&#39;) version=$(echo "$line" | awk &#39;{print $2}&#39;) actual_versions_103["$package"]="$version" fi done <<< "$local_version_output" # 检查103主机关键版本 if [[ "${actual_versions_103[basic_server]:-}" != "1.2.36" ]] || \ [[ "${actual_versions_103[boardresources]:-}" != "1.1.8" ]] || \ [[ "${actual_versions_103[drdds-ros2-msgs]:-}" != "1.0.1" ]] || \ [[ "${actual_versions_103[drddslib]:-}" != "1.1.0" ]] || \ [[ "${actual_versions_103[ecan-master]:-}" != "2.1.1" ]] || \ [[ "${actual_versions_103[height_map_nav]:-}" != "1.0.4" ]] || \ [[ "${actual_versions_103[lio_perception]:-}" != "1.0.10" ]] || \ [[ "${actual_versions_103[log4cplus-dev]:-}" != "2.0.41" ]] || \ [[ "${actual_versions_103[mcu_update]:-}" != "1.0.3" ]] || \ [[ "${actual_versions_103[node_driver]:-}" != "1.1.8" ]] || \ [[ "${actual_versions_103[rl_deploy]:-}" != "1.4.6" ]] || \ [[ "${actual_versions_103[robot_common_lib]:-}" != "1.0.0" ]]; then all_hosts_correct=false fi else all_hosts_correct=false fi # 检查主机104版本结果 if [[ -n "$remote_version_output_104" ]]; then declare -A actual_versions_104 while IFS= read -r line; do if [[ -n "$line" ]]; then package=$(echo "$line" | awk &#39;{print $1}&#39;) version=$(echo "$line" | awk &#39;{print $2}&#39;) actual_versions_104["$package"]="$version" fi done <<< "$remote_version_output_104" # 检查104主机关键版本 if [[ "${actual_versions_104[boardresources]:-}" != "1.1.8" ]] || \ [[ "${actual_versions_104[drdds-ros2-msgs]:-}" != "1.0.1" ]] || \ [[ "${actual_versions_104[drddslib]:-}" != "1.1.0" ]] || \ [[ "${actual_versions_104[log4cplus-dev]:-}" != "2.0.41" ]] || \ [[ "${actual_versions_104[node_driver]:-}" != "1.1.8" ]] || \ [[ "${actual_versions_104[robot_common_lib]:-}" != "1.0.0" ]]; then all_hosts_correct=false fi else all_hosts_correct=false fi # 检查主机106版本结果 if [[ -n "$remote_version_output_106" ]]; then declare -A actual_versions_106 while IFS= read -r line; do if [[ -n "$line" ]]; then package=$(echo "$line" | awk &#39;{print $1}&#39;) version=$(echo "$line" | awk &#39;{print $2}&#39;) actual_versions_106["$package"]="$version" fi done <<< "$remote_version_output_106" # 检查106主机关键版本 if [[ "${actual_versions_106[boardresources]:-}" != "1.1.8" ]] || \ [[ "${actual_versions_106[charge-manager]:-}" != "4.0.25" ]] || \ [[ "${actual_versions_106[drdds-ros2-msgs]:-}" != "1.0.1" ]] || \ [[ "${actual_versions_106[drddslib]:-}" != "1.1.0" ]] || \ [[ "${actual_versions_106[handler]:-}" != "1.0.6" ]] || \ [[ "${actual_versions_106[localization]:-}" != "3.2.3" ]] || \ [[ "${actual_versions_106[log4cplus-dev]:-}" != "2.0.41" ]] || \ [[ "${actual_versions_106[node_driver]:-}" != "1.1.6" ]] || \ [[ "${actual_versions_106[planner]:-}" != "2.0.6" ]] || \ [[ "${actual_versions_106[robot_common_lib]:-}" != "1.0.0" ]] || \ [[ "${actual_versions_106[slam]:-}" != "3.1.1" ]]; then all_hosts_correct=false fi else all_hosts_correct=false fi echo "" echo "========================================" if $all_hosts_correct; then echo "🎉 恭喜!三个主机的所有软件版本都正确!" echo "✅ 主机103: 所有12个软件包版本正确" echo "✅ 主机104: 所有6个软件包版本正确" echo "✅ 主机106: 所有11个软件包版本正确" echo "✓ 系统版本验证通过,可以正常使用" else echo "⚠️ 版本检查完成,部分软件版本需要注意" echo "请查看上方详细信息,确保关键软件版本正确" fi echo "✓ 三个主机版本检查完成" ;; 9) echo "执行: 一键标定" echo "" echo "请选择标定方式:" echo "1) 一键标定 (全关节标定)" echo "2) 单关节标定" echo "" read -p "请输入选择 (1或2): " calibration_choice case $calibration_choice in 1) echo "执行: 一键标定" echo "正在切换到标定目录..." cd /opt/robot/bin/ echo "执行标定命令..." sudo ./SetHome -1 if [ $? -eq 0 ]; then echo "✓ 一键标定执行完成" else echo "✗ 一键标定执行失败" fi ;; 2) echo "执行: 单关节标定" echo "第一条命令:" echo "1. cd /opt/robot/bin/" cd /opt/robot/bin/ echo "✓ 已切换到标定目录" echo "" echo "第二条命令:" read -p "2.输入关节编号: " joint_number if [[ "$joint_number" =~ ^[0-9]+$ ]]; then echo "执行命令: sudo ./SetHome $joint_number" sudo ./SetHome $joint_number if [ $? -eq 0 ]; then echo "✓ 关节$joint_number 标定执行完成" else echo "✗ 关节$joint_number 标定执行失败" fi else echo "✗ 无效的关节编号,请输入数字" fi ;; *) echo "✗ 无效选择,请输入1或2" ;; esac ;; 10) echo "执行: 一键标零" echo "⚠️ 警告: 一键标零操作具有一定危险性,请确保设备处于安全状态" echo "" echo "请选择操作:" echo "1) 确定执行一键标零" echo "2) 退出返回主菜单" read -p "请输入选择 (1或2): " zero_choice case $zero_choice in 1) echo "正在切换到标定目录..." cd /opt/robot/bin/ echo "执行标零命令..." sudo ./AutoSetHome -1 if [ $? -eq 0 ]; then echo "✓ 一键标零执行完成" else echo "✗ 一键标零执行失败" fi ;; 2) echo "✗ 已退出一键标零操作" ;; *) echo "✗ 无效选择,已退出一键标零操作" ;; esac ;; 11) echo "=== ros导航菜单 ===" echo "" echo "请选择操作:" echo "1) 开启建图" echo "2) 关闭建图并重启定位服务" echo "3) 启动ROS环境RViz2" echo "4) 退出" echo "" while true; do read -p "请输入选项 (1-4): " ros_choice case $ros_choice in 1) echo "执行命令: sudo drmap mapping" sudo drmap mapping if [ $? -eq 0 ]; then echo "✓ 建图已开启" else echo "✗ 开启建图失败" fi ;; 2) echo "执行以下命令序列:" echo "1. sudo drmap stop_mapping" sudo drmap stop_mapping if [ $? -eq 0 ]; then echo "✓ 建图已关闭" else echo "✗ 关闭建图失败" fi echo "2. sudo systemctl restart localization.service" sudo systemctl restart localization.service if [ $? -eq 0 ]; then echo "✓ 定位服务重启成功" else echo "✗ 定位服务重启失败" fi echo "3. source /opt/ros/foxy/setup.bash" source /opt/ros/foxy/setup.bash echo "✓ ROS环境已载" echo "4. export XAUTHORITY=/home/user/.Xauthority" export XAUTHORITY=/home/user/.Xauthority export DISPLAY=:0 echo "✓ X11授权已设置" ;; 3) echo "执行命令: su" echo "切换到root用户后,请手动输入: rviz2" echo "提示: 在root环境下输入 rviz2 启动可视化界面" echo " 使用 exit 返回普通用户" su echo "✓ 已返回普通用户" ;; 4) echo "退出ros导航菜单" break ;; *) echo "无效选项,请重新输入 (1-4)" ;; esac echo "" echo "继续选择操作:" echo "1) 开启建图" echo "2) 关闭建图并重启定位服务" echo "3) 启动ROS环境RViz2" echo "4) 退出" done ;; 12) echo "=== 组件命令测试菜单 ===" echo "" echo "请选择测试命令:" echo "1) ping 10.21.33.201" echo "2) ping 10.21.33.202" echo "3) sudo systemctl stop serial-logger.service" echo "4) sudo minicom" echo "5) 退出" echo "" while true; do read -p "请输入选项 (1-5): " test_choice case $test_choice in 1) echo "执行: 持续 ping 10.21.33.201" echo "⚠️ 注意: 这是持续ping,按 Ctrl+C 停止" ping 10.21.33.201 echo "✓ ping 10.21.33.201 已停止" ;; 2) echo "执行: 持续 ping 10.21.33.202" echo "⚠️ 注意: 这是持续ping,按 Ctrl+C 停止" ping 10.21.33.202 echo "✓ ping 10.21.33.202 已停止" ;; 3) echo "执行: 停止 serial-logger 服务" sudo systemctl stop serial-logger.service if [ $? -eq 0 ]; then echo "✓ serial-logger.service 已停止" # 检查服务状态 if systemctl is-active --quiet serial-logger.service; then echo "⚠️ 服务仍在运行" else echo "✓ 服务已成功停止" fi else echo "✗ 停止 serial-logger.service 失败" fi ;; 4) echo "执行: 启动 minicom" echo "⚠️ 注意: minicom 是串口通信工具,按 Ctrl+A 然后 X 退出" echo "正在启动 minicom..." sudo minicom echo "✓ minicom 已退出" ;; 5) echo "退出组件命令测试菜单" break ;; *) echo "无效选项,请重新输入 (1-5)" ;; esac echo "" echo "继续选择测试命令:" echo "1) ping 10.21.33.201" echo "2) ping 10.21.33.202" echo "3) 停止serial-logger服务" echo "4) 启动minicom" echo "5) 退出" done ;; 13) echo "=== ros导航执行菜单 ===" echo "" echo "请选择要执行的命令:" echo "1) sudo drmap mapping" echo "2) sudo drmap stop_mapping" echo "3) sudo systemctl restart localization.service" echo "4) su" echo "5) source /opt/ros/foxy/setup.bash" echo "6) export XAUTHORITY=/home/user/.Xauthority" echo "7) rviz2" echo "8) 一键启动ROS+RViz2" echo "9) 退出" echo "" while true; do read -p "请输入选项 (1-9): " ros_output_choice case $ros_output_choice in 1) echo "正在执行: sudo drmap mapping" sudo drmap mapping echo "✓ 建图命令执行完成" ;; 2) echo "正在执行: sudo drmap stop_mapping" sudo drmap stop_mapping echo "✓ 停止建图命令执行完成" ;; 3) echo "正在执行: sudo systemctl restart localization.service" sudo systemctl restart localization.service echo "✓ 定位服务重启完成" ;; 4) echo "正在执行: su" echo "提示: 输入root密码,使用exit返回菜单" su echo "✓ 已返回菜单" ;; 5) echo "正在执行: source /opt/ros/foxy/setup.bash" source /opt/ros/foxy/setup.bash echo "✓ ROS环境已载" ;; 6) echo "正在设置X11授权..." export XAUTHORITY=/home/user/.Xauthority export DISPLAY=:0 echo "✓ X11授权显示已设置" ;; 7) echo "正在启动RViz2..." echo "注意: 请确保已先执行选项56" if command -v rviz2 >/dev/null 2>&1; then rviz2 & echo "✓ RViz2已在后台启动" else echo "✗ 找不到rviz2命令,请先载ROS环境(选项5)" fi ;; 8) echo "正在一键启动ROS环境RViz2..." echo "步骤1: 载ROS环境" source /opt/ros/foxy/setup.bash echo "步骤2: 设置X11授权" export XAUTHORITY=/home/user/.Xauthority export DISPLAY=:0 echo "步骤3: 启动RViz2" if command -v rviz2 >/dev/null 2>&1; then rviz2 & echo "✓ ROS环境RViz2启动完成" else echo "✗ RViz2启动失败,请检查ROS安装" fi ;; 9) echo "退出ros导航执行菜单" break ;; *) echo "无效选项,请重新输入 (1-9)" ;; esac echo "" echo "继续选择要执行的命令:" echo "1) sudo drmap mapping" echo "2) sudo drmap stop_mapping" echo "3) sudo systemctl restart localization.service" echo "4) su" echo "5) source /opt/ros/foxy/setup.bash" echo "6) export XAUTHORITY=/home/user/.Xauthority" echo "7) rviz2" echo "9) 一键启动ROS+RViz2" echo "8) 退出" done ;; 14) echo "=== M20 设备配置脚本使用说明 ===" echo "" echo "📋 脚本功能概述:" echo "本脚本用于M20设备的完整配置管理,包含设备配置、软件安装、系统维护等功能。" echo "" echo "🔧 各选项功能说明:" echo "" echo "1️⃣ 配置狗wifi编号 (MFI.toml)" echo " - 修改MFI.toml文件中的批次号(lot_id)序列号(sn)" echo " - 修改host_name文件中的设备编号" echo " - 自动触发系统同步机制" echo "" echo "2️⃣ 修改设备型号 (HWI.toml)" echo " - 设置设备类型:STD(标准版) 或 PRO(专业版)" echo " - 自动备份原配置文件" echo " - 支持失败回滚" echo "" echo "3️⃣ 安装版本包" echo " - 复制.debs文件release_note.json到目标目录" echo " - 自动执行安装脚本" echo " - 检查文件完整性" echo "" echo "4️⃣ 删除脚本" echo " - 清理临时测试文件" echo " - 删除/home/user/m20test2.sh" echo "" echo "5️⃣ 设置硬件时间" echo " - 设置本地系统时间硬件时钟" echo " - 可选择同步到远程主机(104/106)" echo " - 显示所有主机的硬件时钟状态" echo "" echo "6️⃣ 设置硬件时间" echo " - 设置本地系统时间硬件时钟" echo " - 可选择同步到远程主机(104/106)" echo " - 显示所有主机的硬件时钟状态" echo "" echo "7️⃣ 显示三个主机时间" echo " - 查询本地主机(103)当前系统时间硬件时钟" echo " - 远程查询主机104106的当前时间" echo " - 实时显示所有主机的时间状态" echo "" echo "8️⃣ 执行完整主机安装流程" echo " - 自动执行选项1-4的完整配置流程" echo " - 一键完成设备初始化配置" echo "" echo "9️⃣ 显示软件版本" echo " - 查询本地主机(103)软件版本" echo " - 远程查询主机104106的软件版本" echo " - 显示CMakelog4cplus相关软件包" echo "" echo "🔟 执行一键标定" echo " - 切换到/opt/robot/bin/目录" echo " - 执行SetHome -1命令进行全关节标定" echo "" echo "1️⃣1️⃣ 执行一键标零" echo " - 切换到/opt/robot/bin/目录" echo " - 执行AutoSetHome -1命令进行自动标零" echo " - 包含安全确认机制,防止误操作" echo "" echo "1️⃣2️⃣ ros导航菜单" echo " - 开启/关闭建图功能" echo " - 启动ROS环境RViz2可视化工具" echo " - 管理localization服务" echo "" echo "1️⃣3️⃣ 组件命令测试菜单" echo " - ping网络连通性测试(10.21.33.201/202)" echo " - 停止serial-logger服务" echo " - 启动minicom串口通信工具" echo "" echo "1️⃣4️⃣ 脚本使用说明" echo " - 显示本帮助信息" echo "" echo "1️⃣5️⃣ 退出" echo " - 安全退出脚本" echo "" echo "⚠️ 重要提示:" echo "• 脚本需要sudo权限运行" echo "• 执行前请确保相关文件存在" echo "• 建议在执行前备份重要配置文件" echo "• 远程操作需要SSH密钥认证或密码" echo "" echo "🌐 网络环境:" echo "• 当前主机:10.21.31.103" echo "• 远程主机:10.21.31.104, 10.21.31.106" echo "• SSH用户:user" echo "" echo "按回车键返回主菜单..." read ;; 15) echo "执行: 删除脚本" echo "⚠️ 警告: 此操作将删除当前脚本文件" echo "" echo "将要删除的文件:" echo "- /home/user/m20_simple.sh" echo "" read -p "确认删除? (输入 &#39;DELETE&#39; 确认): " delete_confirm if [ "$delete_confirm" = "DELETE" ]; then echo "正在删除脚本文件..." rm -f /home/user/m20_simple.sh if [ $? -eq 0 ]; then echo "✓ 脚本文件删除成功" echo "脚本将在3秒后退出..." sleep 3 exit 0 else echo "✗ 脚本文件删除失败" fi else echo "✗ 删除操作已取消" fi ;; 16) echo "重启系统" echo "⚠️ 警告: 系统将重启,请确保已保存所有工作" echo "" echo "请选择操作:" echo "1) 确认重启" echo "2) 返回菜单" echo "" read -p "请输入选择 (1或2): " reboot_choice case $reboot_choice in 1) echo "正在重启系统..." echo "系统将在3秒后重启" sleep 1 echo "3..." sleep 1 echo "2..." sleep 1 echo "1..." sudo reboot ;; 2) echo "已取消重启,返回主菜单" ;; *) echo "无效选择,返回主菜单" ;; esac ;; 17) echo "退出脚本" log_info "用户选择退出脚本" echo "" echo "📋 操作总结:" echo "日志文件: $LOG_FILE" echo "感谢使用 M20 设备配置脚本!" exit 0 ;; *) echo "无效选项,请重新输入 (1-17)" log_warn "用户输入无效选项: $choice" ;; esac echo "" echo "继续选择操作:" echo "1) 修改wifi名称" echo "2) 修改编号(MFI.toml)" echo "3) 修改设备型号 (HWI.toml)" echo "4) 安装版本包" echo "5) 设置硬件时间" echo "6) 显示三个主机时间" echo "7) 执行完整主机安装流程" echo "8) 显示软件版本" echo "9) 执行一键标定" echo "10) 执行一键标零" echo "11) ros导航菜单" echo "12) 组件命令测试菜单" echo "13) ros导航输出菜单" echo "14) 脚本使用说明" echo "15) 删除脚本" echo "16) 重启系统" echo "17) 退出" done 我想把这个转成python模块
最新发布
11-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值