$ echo $PS1
$
$ echo $PS2
>
$ echo $PS3
$ echo $PS4
+
$ select i in 1 2 3
> do
> case $i in
> 1)
> echo 1
> ;;
> *)
> ;;
> esac
> done
1) 1
2) 2
3) 3
#? 1
1
$ PS3="##? "
$ select i in 1 2 3; do case $i in 1) echo 1; ;; *) ;; esac; done
1) 1
2) 2
3) 3
##? 1
1
ご覧のとおり、、、$PS1
は$PS2
値$PS4
を持ち、期待どおりに機能します。$PS3
空ですが(またはスペース、タブなどが含まれています) for をselect
使用しますが、変数が設定されている場合は正しく機能します。#?
$PS3
なぜこのように動作し、なぜこのように設計されたのですか?
答え1
なぜなら医師がこう言ったからです。
https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#Bash-Variables
PS3
この変数の値は、コマンドを選択するためのプロンプトとして使用されます。この変数が設定されていない場合、select コマンドは「#?」というメッセージを表示します。
答え2
Bashにハードコードされているようです。execute_cmd.c
function にはexecute_select_command()
次のものがあります。
ps3_prompt = get_string_value ("PS3");
if (ps3_prompt == 0)
ps3_prompt = "#? ";
これはPS3
設定されていない場合にのみ発生します。空の文字列に設定すると、メッセージはselect
表示されません。
答え3
存在するbash
、PS3
"#? "
未設定の場合に設定、デフォルトです。
また、POSIXがselect
定義されていないPS3
ため、動作が異なる場合があります。
ksh
、mksh
およびschilyがデフォルトyash
に設定されています。zsh
sh
"#? "
dash
、家宝sh
、ビジボックスsh
が設定されていません。PS3
答え4
他の人がすでにその理由に答えていますが、方法は次のとおりです。 PS3をnullに設定してください。
$ PS3=$'\0'
$ select i in 1 2 3; do case $i in 1) echo "option #" 1; ;; *) ;; esac; done
1) 1
2) 2
3) 3
1
option # 1