【问题标题】:How to set a default value in an IF snippet?如何在 IF 片段中设置默认值?
【发布时间】:2010-05-30 01:40:39
【问题描述】:

我在用 Solaris 10 编写的 bash 脚本中有以下 sn-p:

printf "port(389)="
read PORT
  if [[ $PORT == "" ]]; then
     PORT=389
  fi

如果用户按下回车键,我想要得到的是,端口应该设置为 389。 上面的 sn-p 似乎不起作用。

有什么建议吗?

【问题讨论】:

  • 你能比“不起作用”更具体吗?
  • 在这里工作正常。你做错了什么。

标签: bash solaris


【解决方案1】:

这会提示用户输入,如果自行按下回车,则将port 的值设置为默认值“389”:

read -rp "port(389)=" port
port="${port:-389}"

【讨论】:

  • 我无法在此处粘贴漏洞代码,因为它是处理为目录服务器创建证书的更大脚本的一部分。但是我使用目录服务器的“certutil”来接受用户基于“组织”、“城市”、“国家”等问题的输入。端口就是其中之一。使用方式如下:$DSBIN/certutil -d $BASE_DIR/hostname/alias -P slapd- -x -S -n $NAME -s cn=$CN,cn=$PORT,st=$STATE,C =$COUNTRY,L="$CITY" -t CTu,u,u -v $MONTH 使用我原来的 if 语句,系统抛出“坏数据库”错误,如果一个或多个条目无效,就会发生这种情况
  • 实际上,我的 sn-p 和您的 sn-p 功能基本相同(一个例外是我的具有 -r 选项的 read)。您可以尝试在导致问题的代码部分之前放置set -xset +x。这将导致显示跟踪,其中显示变量扩展等。它可能有助于追查问题。
【解决方案2】:

这不是您所要求的,但 Solaris 有一组用于此类事情的实用程序。

PORT=`/usr/bin/ckint -d 389 -p 'port(389)=' -h 'Enter a port number'`

查看其他 /usr/bin/ck* 实用程序以提示用户输入其他类型的数据,包括文件或用户名等内容。

【讨论】:

  • 这实际上是我想要达到的。太好了,谢谢。
【解决方案3】:

如果您将-e 传递给read,那么您可以使用-i 为提示指定初始值。

【讨论】:

    【解决方案4】:

    如果用户不输入任何内容,则 $PORT 将被替换为空 - 使用原始 Bourne shell 进行这项工作的古老惯例是:

    if [ "x$PORT" == "x" ]; then
    

    虽然更现代的 shell(即实际的 bash,但不是 Solaris 10 /bin/sh,它是 一个古老的 Bourne shell) 应该能够处理:

    if [[ "$PORT" == "" ]]; then
    

    甚至

    if [[ -z "$PORT" ]]; then
    

    【讨论】:

      【解决方案5】:

      仅使用外壳的另一种方式 -- 尝试参数替换:

      read port
      port=${port:-389}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-21
        • 2023-02-24
        • 2015-06-21
        • 1970-01-01
        • 1970-01-01
        • 2019-12-24
        • 1970-01-01
        • 2016-02-13
        相关资源
        最近更新 更多