diff --git a/src/main.sh b/src/main.sh index b841a14..ab392eb 100644 --- a/src/main.sh +++ b/src/main.sh @@ -179,7 +179,7 @@ detect_lvm() { # 二次检测:通过 lsblk 查看 TYPE if [[ "$LVM_DETECTED" == false ]]; then local root_type - root_type=$(lsblk -no TYPE "$ROOT_DEVICE" 2>/dev/null | head -1) + root_type=$(lsblk -no TYPE "$ROOT_DEVICE" 2>/dev/null | head -1) || true if [[ "$root_type" == "lvm" ]]; then LVM_DETECTED=true info "检测到 LVM 架构(通过 lsblk)" @@ -198,7 +198,7 @@ get_disk_for_partition() { local part="$1" # 通过 lsblk 获取父级磁盘设备 local disk - disk=$(lsblk -no PKNAME "$part" 2>/dev/null | head -1) + disk=$(lsblk -no PKNAME "$part" 2>/dev/null | head -1) || true if [[ -z "$disk" ]]; then die "无法获取 $part 的父级磁盘设备" fi @@ -212,10 +212,10 @@ get_partition_number() { local part="$1" # 从设备名提取分区号,如 /dev/sda1 -> 1, /dev/vda2 -> 2 local num - num=$(echo "$part" | grep -oP '\d+$') + num=$(echo "$part" | grep -oP '\d+$') || true if [[ -z "$num" ]]; then # 尝试 p 分隔格式,如 /dev/mmcblk0p1 -> 1 - num=$(echo "$part" | grep -oP 'p\K\d+$') + num=$(echo "$part" | grep -oP 'p\K\d+$') || true fi if [[ -z "$num" ]]; then die "无法从 $part 提取分区号" @@ -238,11 +238,11 @@ print_disk_status() { if [[ "$LVM_DETECTED" == true ]]; then info "--- LVM 信息 ---" info "物理卷 (PV):" - pvs 2>/dev/null | tee -a "$LOG_FILE" + { pvs 2>/dev/null || true; } | tee -a "$LOG_FILE" info "卷组 (VG):" - vgs 2>/dev/null | tee -a "$LOG_FILE" + { vgs 2>/dev/null || true; } | tee -a "$LOG_FILE" info "逻辑卷 (LV):" - lvs 2>/dev/null | tee -a "$LOG_FILE" + { lvs 2>/dev/null || true; } | tee -a "$LOG_FILE" echo "" fi info "====================================" @@ -260,17 +260,21 @@ check_expandable_space() { } #--------------------------------------- -# 安全提取数值(去除小数部分,兼容 set -e) +# 安全提取数值(去除小数/前缀/后缀,兼容 set -e) #--------------------------------------- parse_int() { - # 从字符串中提取整数部分,忽略小数和后缀 - # 输入: "8217.60" / "8.22g" / " 100 " 等 - # 输出: 纯整数字符串,如 "8217" / "8" / "100" + # 从字符串中提取整数部分 + # 输入: "8217.60" / "<19.00" / "8.22g" / " 100 " / "0" 等 + # 输出: 纯整数字符串,如 "8217" / "19" / "8" / "100" / "0" local val="$1" - # 去除首尾空格 - val=$(echo "$val" | xargs) - # 提取整数部分(兼容小数点) - echo "$val" | awk '{printf "%d", $1}' + # 去除首尾空格、< > 前缀、非数字字符(保留小数点) + val=$(echo "$val" | tr -d '<>' | sed 's/[^0-9.]//g') + if [[ -z "$val" ]] || [[ "$val" == "." ]]; then + echo "0" + return + fi + # 用 awk 取整数部分 + echo "$val" | awk '{printf "%d", $1+0}' } #--------------------------------------- @@ -278,19 +282,19 @@ parse_int() { #--------------------------------------- check_lvm_space() { # 获取根设备所在的 VG - ROOT_VG=$(lvs -no vg_name "$ROOT_DEVICE" 2>/dev/null | xargs) + ROOT_VG=$(lvs -no vg_name "$ROOT_DEVICE" 2>/dev/null | xargs) || true if [[ -z "$ROOT_VG" ]]; then die "无法获取根逻辑卷所在的卷组" fi info "根目录所在卷组 (VG): $ROOT_VG" # 获取 VG 的可用空间(人类可读格式,用于显示) - VG_FREE_HUMAN=$(vgs -no vg_free "$ROOT_VG" --units g --nosuffix 2>/dev/null | xargs) + VG_FREE_HUMAN=$(vgs -no vg_free "$ROOT_VG" --units g --nosuffix 2>/dev/null | tr -d '<> ' ) || true info "卷组 $ROOT_VG 可用空间: ${VG_FREE_HUMAN}G" # 检查 VG 是否有剩余空间(以 MB 为单位判断) local vg_free_raw - vg_free_raw=$(vgs -no vg_free "$ROOT_VG" --units m --nosuffix 2>/dev/null) + vg_free_raw=$(vgs -no vg_free "$ROOT_VG" --units m --nosuffix 2>/dev/null) || true VG_FREE_NUM=$(parse_int "$vg_free_raw") info "卷组可用空间: ${VG_FREE_NUM}MB" @@ -299,9 +303,9 @@ check_lvm_space() { info "卷组可用空间不足,将检查是否需要扩展物理卷 (PV)..." expand_pv_if_needed # 重新获取可用空间 - vg_free_raw=$(vgs -no vg_free "$ROOT_VG" --units m --nosuffix 2>/dev/null) + vg_free_raw=$(vgs -no vg_free "$ROOT_VG" --units m --nosuffix 2>/dev/null) || true VG_FREE_NUM=$(parse_int "$vg_free_raw") - VG_FREE_HUMAN=$(vgs -no vg_free "$ROOT_VG" --units g --nosuffix 2>/dev/null | xargs) + VG_FREE_HUMAN=$(vgs -no vg_free "$ROOT_VG" --units g --nosuffix 2>/dev/null | tr -d '<> ') || true if [[ -z "$VG_FREE_NUM" ]] || [[ "$VG_FREE_NUM" -lt 100 ]]; then die "卷组 $ROOT_VG 没有足够的可用空间进行扩容(需要至少 100MB)" fi @@ -316,7 +320,7 @@ check_lvm_space() { expand_pv_if_needed() { # 获取 VG 对应的 PV local pv_dev - pv_dev=$(pvs -no pv_name "$ROOT_VG" 2>/dev/null | xargs) + pv_dev=$(pvs -no pv_name "$ROOT_VG" 2>/dev/null | xargs) || true if [[ -z "$pv_dev" ]]; then die "无法获取卷组 $ROOT_VG 的物理卷" fi @@ -547,9 +551,9 @@ verify_result() { echo "" if [[ "$LVM_DETECTED" == true ]]; then info "--- LVM 信息 ---" - pvs 2>/dev/null | tee -a "$LOG_FILE" - vgs 2>/dev/null | tee -a "$LOG_FILE" - lvs 2>/dev/null | tee -a "$LOG_FILE" + { pvs 2>/dev/null || true; } | tee -a "$LOG_FILE" + { vgs 2>/dev/null || true; } | tee -a "$LOG_FILE" + { lvs 2>/dev/null || true; } | tee -a "$LOG_FILE" echo "" fi info "===================================="