代码之家  ›  专栏  ›  技术社区  ›  Ricardo Marimon

在bash中读取具有默认值的变量

  •  133
  • Ricardo Marimon  · 技术社区  · 14 年前

    我需要在bash脚本中从终端读取一个值。我想能够提供一个默认值,用户可以更改。

    # Please enter your name: Ricardo^
    

    在这个脚本中,提示是“Please enter your name:”默认值是“Ricardo”,光标将位于默认值之后。有没有办法在bash脚本中实现这一点?

    9 回复  |  直到 14 年前
        1
  •  337
  •   squarecandy    4 年前

    你可以用 parameter expansion

    read -p "Enter your name [Richard]: " name
    name=${name:-Richard}
    echo $name
    

    在括号之间的提示中包含默认值是一种相当常见的约定

    这是什么意思 :-Richard 你要做什么?从bash手册:

    ${parameter:-word}

    同样值得注意的是。。。

    在下面的每种情况下,word都要进行波浪号扩展、参数扩展、命令替换和算术扩展。

    所以如果你用 webpath=${webpath:-~/httpdocs} /home/user/expanded/path/httpdocs ~/httpdocs

        2
  •  182
  •   Trevor Boyd Smith knh170    11 年前
    read -e -p "Enter Your Name:" -i "Ricardo" NAME
    
    echo $NAME
    
        3
  •  51
  •   Dennis Williamson    14 年前

    在Bash 4中:

    name="Ricardo"
    read -e -i "$name" -p "Please enter your name: " input
    name="${input:-$name}"
    

    这将在提示符后显示名称,如下所示:

    Please enter your name: Ricardo
    

        4
  •  17
  •   sibaz    9 年前

    我发现了这个问题,想用一种方式来表达:

    Something interesting happened.  Proceed [Y/n/q]:
    

    echo -n "Something interesting happened.  "
    DEFAULT="y"
    read -e -p "Proceed [Y/n/q]:" PROCEED
    # adopt the default, if 'enter' given
    PROCEED="${PROCEED:-${DEFAULT}}"
    # change to lower case to simplify following if
    PROCEED="${PROCEED,,}"
    # condition for specific letter
    if [ "${PROCEED}" == "q" ] ; then
      echo "Quitting"
      exit
    # condition for non specific letter (ie anything other than q/y)
    # if you want to have the active 'y' code in the last section
    elif [ "${PROCEED}" != "y" ] ; then
      echo "Not Proceeding"
    else
      echo "Proceeding"
      # do proceeding code in here
    fi
    

        5
  •  16
  •   Manish Singh    11 年前

    代码:

    IN_PATH_DEFAULT="/tmp/input.txt"
    read -p "Please enter IN_PATH [$IN_PATH_DEFAULT]: " IN_PATH
    IN_PATH="${IN_PATH:-$IN_PATH_DEFAULT}"
    
    OUT_PATH_DEFAULT="/tmp/output.txt"
    read -p "Please enter OUT_PATH [$OUT_PATH_DEFAULT]: " OUT_PATH
    OUT_PATH="${OUT_PATH:-$OUT_PATH_DEFAULT}"
    
    echo "Input: $IN_PATH Output: $OUT_PATH"
    

    运行示例:

    Please enter IN_PATH [/tmp/input.txt]: 
    Please enter OUT_PATH [/tmp/output.txt]: ~/out.txt
    Input: /tmp/input.txt Output: ~/out.txt
    
        6
  •  11
  •   bukzor    9 年前

    我刚用了这个模式,我更喜欢:

    read name || name='(nobody)'
    
        7
  •  6
  •   Jonathan Leffler vy32    14 年前
    name=Ricardo
    echo "Please enter your name: $name \c"
    read newname
    [ -n "$newname" ] && name=$newname
    

    设置默认值;打印出来;读取新值;如果有新值,请使用它来代替默认值。shell和系统之间存在(或曾经存在)一些关于如何在提示符末尾禁止换行的变体。“\c”符号似乎适用于带有3.xbash的macosx10.6.3,并且适用于大多数从systemv派生的Unix变体,使用Bourne或Korn shell。

    还要注意的是,用户可能不会意识到幕后发生了什么;他们的新数据将在屏幕上已有的名称之后输入。最好将其格式化:

    echo "Please enter your name ($name): \c"
    
        8
  •  1
  •   Sufiyan Ghori    10 年前
    #Script for calculating various values in MB
    echo "Please enter some input: "
    read input_variable
    echo $input_variable | awk '{ foo = $1 / 1024 / 1024 ; print foo "MB" }'
    
        9
  •  -1
  •   speefak    10 年前

    -e和-t参数不能一起工作。我尝试了一些表达式,结果得到以下代码段:

    QMESSAGE="SHOULD I DO YES OR NO"
    YMESSAGE="I DO"
    NMESSAGE="I DO NOT"
    FMESSAGE="PLEASE ENTER Y or N"
    COUNTDOWN=2
    DEFAULTVALUE=n
    #----------------------------------------------------------------#
    function REQUEST ()
    {
    read -n1 -t$COUNTDOWN -p "$QMESSAGE ? Y/N " INPUT
        INPUT=${INPUT:-$DEFAULTVALUE}
        if  [ "$INPUT" = "y" -o "$INPUT" = "Y" ] ;then
            echo -e "\n$YMESSAGE\n"
            #COMMANDEXECUTION
        elif    [ "$INPUT" = "n" -o "$INPUT" = "N" ] ;then
            echo -e "\n$NMESSAGE\n"
            #COMMANDEXECUTION
        else
            echo -e "\n$FMESSAGE\n"
        REQUEST
        fi
    }
    REQUEST