ubuntu select控制语句不退出

悟透 / 2023-07-16 / 原文

解决方法:
如果用户想跳出选择循环,需要在循环体中根据条件在每个分支后增加break语句。

1.用 case 判断:

用字符串选择分支:

msg_info "请选择 dev 更新到哪个 Release 分支,数字(其他数字手动输入): "
select mode in "code" "go" "java"
do
  case ${mode} in
    "code")
        # msg_ok "选择了: ${mode}"
        rel="code"
        break  ## 不写 break ,选择后不会退出
    ;;
    "go")
        # msg_ok "选择了: ${mode}"
        rel="go"
        break  ## 不写 break ,选择后不会退出
    ;;
    "java")
        # msg_ok "选择了: ${mode}"
        rel="java"
        break  ## 不写 break ,选择后不会退出
    ;;
    *)
        ## 让用户自己输入值
        read -p "请输入 dev 更新到哪个 Release 分支: " rel
    ;;
  esac
done  ## select END

用数字选择分支:

msg_info "请选择 dev 更新到哪个 Release 分支,数字(其他数字手动输入): "
select mode in "code" "go" "java"
do
  case ${REPLY} in
    1)
        # msg_ok "选择了: ${mode}"
        rel="code"
        break  ## 不写 break ,选择后不会退出
    ;;
    2)
        # msg_ok "选择了: ${mode}"
        rel="go"
        break  ## 不写 break ,选择后不会退出
    ;;
    3)
        # msg_ok "选择了: ${mode}"
        rel="java"
        break  ## 不写 break ,选择后不会退出
    ;;
    *)
        ## 让用户自己输入值
        read -p "请输入 dev 更新到哪个 Release 分支: " rel
        break  ## 不写 break ,选择后不会退出
    ;;
  esac
done  ## select END

REPLY:是获取 select 循环对应的数字序号的环境变量(用户输入被保存在内置变量REPLY 中)。


2.用 if 语句判断选择:

msg_info "请选择 dev 更新到哪个 Release 分支,数字(其他数字手动输入): "
select mode in "code" "go" "java"
do
  if [ "code" = "${mode}" ]; then
      msg_ok "选择了: ${mode}"
      rel="code"
      break  ## 不写 break ,选择后不会退出
  elif [ "go" = "${mode}" ]; then
      msg_ok "选择了: ${mode}"
      rel="go"
  elif [ "java" = "${mode}" ]; then
      msg_ok "选择了: ${mode}"
      rel="java"
  else
      ## 让用户自己输入值
      read -p "请输入 dev 更新到哪个 Release 分支: " rel
      break  ## 不写 break ,选择后不会退出
  fi
done  ## select END

3.让用户直接输入(省去用 read)

PS3="请选择 dev 更新到哪个 Release 分支,数字(其他数字手动输入): "
select mode in "code" "go" "java"
do
  case ${mode} in
    "code")
        # msg_ok "选择了: ${mode}"
        rel="code"
        break  ## 不写 break ,选择后不会退出
    ;;
    "go")
        # msg_ok "选择了: ${mode}"
        rel="go"
        break  ## 不写 break ,选择后不会退出
    ;;
    "java")
        # msg_ok "选择了: ${mode}"
        rel="java"
        break  ## 不写 break ,选择后不会退出
    ;;
    *)
        ## 让用户自己输入值
        rel="${REPLY}"
    ;;
  esac
done  ## select END

当列表中没有用户想要的内容,可以直接把系统内置变量的值作为用户自定义的内容,省去调用 read 再次读取。
REPLY:用户输入被保存在内置变量REPLY 中。
PS3:自定义系统提示,默认是#?





参考:
《跟老男孩学Linux运维》P242
https://www.jb51.net/article/70314.htm