用默认值在bash中读取一个variables

我需要从bash脚本中读取terminal的值。 我希望能够提供用户可以更改的默认值。

# Please enter your name: Ricardo^ 

在这个脚本中,提示是“请input你的名字:”默认值是“里卡多”,光标会在默认值之后。 有没有办法做到这一点在bash脚本?

你可以使用参数扩展例如

 read -p "Enter: " name name=${name:-Richard} echo $name 
 read -e -p "Enter Your Name:" -i "Ricardo" NAME echo $NAME 

在Bash 4:

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

这样的提示后显示名称:

 Please enter your name: Ricardo 

将光标放在名称的末尾,并允许用户对其进行编辑。 最后一行是可选的,如果用户删除input或默认(强制为null),强制名称为原始默认值。

码:

 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 

我发现这个问题,寻找一种方式来呈现如下:

 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 

如果遇到同样的问题,希望帮助别人不必去想出逻辑

我刚刚使用这种模式,我更喜欢:

 read name || name='(nobody)' 
 name=Ricardo echo "Please enter your name: $name \c" read newname [ -n "$newname" ] && name=$newname 

设置默认值; 打印它; 读一个新的价值; 如果有新值,则用它代替默认值。 关于如何在提示结束时禁止换行,shell和系统之间存在(或者是)一些变化。 '\ c'表示法似乎可以在Mac OS X 10.6.3上使用3.x bash,并且可以在使用Bourne或Korn shell的从System V派生的大多数Unix变体上运行。

另外请注意,用户可能不会意识到幕后发生的事情; 他们的新数据将被input在屏幕上的名字之后。 格式化可能会更好:

 echo "Please enter your name ($name): \c" 

-e和-t参数不能一起工作。 我尝试了一些expression式,结果是下面的代码片段:

 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 
 #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" }'