$ 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
为空(或包含空格、制表符等),但select
使用的是#?
for $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
、yash
和zsh
schilysh
将默认设置为"#? "
。dash
, 传家宝sh
, busyboxsh
不设置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