2

ターミナル経由でインストールまたは更新するときに、Ubuntuでそれを発見した人もいるかもしれません

次のような質問が表示されます

「パッケージをインストールまたは削除しますか [Y/n]?」

Enter キーを押すと、「Y」または「y」と入力したときと同じようになります。

それで、bashでそれを作成する方法を考えていました。これは私がこれまでに持っているものですか?

echo "question?[Y/n]"
read choose
if [ $choose ~= "Y" ] [ $choose ~= "y" ] [ $choose ~= "" ]
then 
#code
fi
4

4 に答える 4

6

古典的に (つまり、 以外の POSIX 風のシェルで動作することを意味しbashます)、次のように記述します。

echo "Question? [Y/n]"
read choose
if [ "$choose" = "Y" ] || [ "$choose" = "y" ] || [ -z "$choose" ]
then 
    # code
fi

$choose引用符は、空の文字列であっても、テスト オペレーターが引数を認識できるようにします。

この[[演算子を使用すると、文字列を引用せずに逃げることができるようですが、POSIX シェルの一部ではありません。POSIX は、次の点に注意してその存在を認識しています。

次の単語は、一部の実装では予約語として認識される場合があり (文字が引用符で囲まれていない場合)、特定できない結果を引き起こします。

[[    ]]    function    select

シェルがカーソルをプロンプトと同じ行に置いておきたい場合は、次を使用できます。

printf "Question? [Y/n] "

POSIX シェルは\cエスケープを認識します。bashではない:

echo "Question? [Y/n] \c"

bash(それを処理する方法があるかもしれませんが、printfおそらくより移植性があります。)

于 2012-09-17T23:34:14.577 に答える
3
echo -n "Question? [Y/n]"
read choose 
shopt -s nocasematch
if [[ "${choose:=Y}" =~ Y ]]; then
     # they said yes
else
     # they said something else
fi

$chooseこのアプローチには、後で調べると Y に設定されたままになるという利点があります。Y入力したのか、Enter キーを押しただけなのかを後で確認したい場合は、${choose:-Y}代わりに を使用できます。

を設定したくない場合は、 と の両方をnocasematchいつでも明示的にチェックできます。または、解決策は気に入っているが、フラグの状態を維持することに関心がある場合は、それを確認して復元できます。Yynocasematch

shopt -q nocasematch
let not_set=$?
shopt -s nocasematch

...

if (( not_set )); then
   shopt -u nocasematch
fi
于 2012-09-17T23:41:47.777 に答える
2

を参照してくださいtest(1)

[ "$choose" = "Y" -o "$choose" = "y" -o "$choose" = "" ]

変数を二重引用符で囲む必要があります。そうしないと、それぞれの左側が空になるため、式は空の変数でエラーを生成します。

于 2012-09-17T23:29:04.287 に答える
1

"read" は入力を入力まで読み取ります。したがって、「入力」だけを回答として受け入れたい場合は、「」回答を試してください。「test」コマンドの代わりに [[ ]] を使用して、文字列をチェックできます ( man test )

dtpwmbp:~ pwadas$ [[ -z "" ]] && echo yes 
yes
dtpwmbp:~ pwadas$ [[ -z "ABCD" ]] && echo yes 
dtpwmbp:~ pwadas$ 

ここでは、文字列の長さが 0 であるかどうかをテストします。

于 2012-09-17T23:22:00.273 に答える