回答:
あなたが使用することができるパラメータ展開などを
read -p "Enter your name [Richard]: " name
name=${name:-Richard}
echo $name
大括弧の間のプロンプトにデフォルト値を含めることは、かなり一般的な慣習です
name=${!input:-$name}
しますか?
$1
になる${1:-some_default_string}
read -e -p "Enter Your Name:" -i "Ricardo" NAME
echo $NAME
-e
する-i
ためには必須であるように思われることに注意してください
バッシュ4では:
name="Ricardo"
read -e -i "$name" -p "Please enter your name: " input
name="${input:-$name}"
次のようにプロンプトの後に名前が表示されます。
Please enter your name: Ricardo
名前の末尾にカーソルを置き、ユーザーが名前を編集できるようにします。最後の行はオプションであり、ユーザーが入力またはデフォルト(nullを送信)を消去すると、名前は強制的に元のデフォルトになります。
name
代わりに使用input
してくださいread
。
$name
、ユーザーが提案された値を削除した場合(したがってNULL文字列を入力した場合)の値が保持されます。それはすべてあなたのニーズが何であるかに依存します。私は私の答えで同じように言った。しかし、あなたがそうだと思いますが、私はより明示的である可能性があり、オプションの行が使用されない場合、変数はそうである可能性があると述べましたname
。
コード:
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
同じ問題が発生した場合に、ロジックを考える必要がない人を助けることを願っています
name=Ricardo
echo "Please enter your name: $name \c"
read newname
[ -n "$newname" ] && name=$newname
デフォルトを設定します。それを印刷します。新しい値を読み取ります。新しい値がある場合は、デフォルトの代わりに使用してください。プロンプトの最後で改行を抑制する方法について、シェルとシステムの間にはいくつかのバリエーションがあります(またはありました)。「\ c」表記は、3.x bashを使用するMacOS X 10.6.3で機能するようであり、BourneまたはKornシェルを使用して、System Vから派生したUnixのほとんどのバリアントで機能します。
また、ユーザーは舞台裏で何が行われているのかおそらく理解できないことに注意してください。それらの新しいデータは、すでに画面上にある名前の後に入力されます。それをフォーマットする方が良いかもしれません:
echo "Please enter your name ($name): \c"
printf
よりも移植性が高いecho
if (test -z "$xxx"); ...
'やその他のCシェルの修正にうんざりしています。
\c
もサポートしていることに驚いていますecho -n
。ただし、-e
エスケープを解釈するには、bashのエコーを取得するために追加する必要があります。私\c
は言っていないもののためだと思います:echo -e "Syntax slightly off\c, but I've learned so much from what you've shared. Thanks, @JonathanLeffler!"
#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" }'
-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
;)
です。これはSOで許可されています!しかし、私たちは無関係なもので他の質問を汚したくありません。
input
でから使用しname=${input:-$name}
ます。