Bash基础——循环结构select

本文介绍了Bash shell中的select循环结构,包括其工作原理:当in words存在时,显示选项并等待用户输入;当没有in words,使用位置参数;空行和EOF触发不同行为;用户输入对应数字时,将变量设为相应选项;输入无效时,变量值为空。select循环通过用户输入的EOF或break命令退出,建议避免在commands中处理复杂任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

select

select name [in words …]; do commands; done

如果in words存在,就会把words打印到标准错误(standard error)流里,并显示PS3提示符,等待从标准输入中读取读取一行。
如果in words不存在,等同于in “$@”,即将位置参数打印到标准错误(standard error)流里,并显示PS3提示符,等待从标准输入中读取读取一行。

$ select var in a b c d; do echo $var;break; done
1) a
2) b
3) c
4) d
#? 1
a
$ bash -c "select var; do echo $var;break; done" -s a b c d
1) a
2) b
3) c
4) d
#? 1
a
  1. 如果从标准输入里读取的是空行,选项列表和PS3会继续显示
$ select var in a b c d; do echo $var;break; done
1) a
2) b
3) c
4) d
#?
1) a
2) b
3) c
4) d
#?
  1. 如果从标准输入里读取的是EOF字符(通常由组合键Ctrl+d输入),select退出

  2. 如果从标准输入里读取的是对应选项的数字,name的值就会被设置为数字对应的word.

  3. 如果从标准输入里读取的不是空行,也不是EOF字符,但不对应任何选项的数字,name的值为null

从标准输入里读取的行,都会保存在变量REPLY里。

$ select var in a b c d; do echo $var;break; done
1) a
2) b
3) c
4) d
#? sdf

$ echo $REPLY
sdf

以上四种输入,第3和第4种输入会使commands被执行。如果没有遇到break命令被执行,words列表和PS3会在命令执行完后再次显示,再次从标准输入中读取一行,进行下一次的执行。break命令能退出select. 个人不建议在select的commands里处理复杂的事务,原因是select的退出方式只有两种:从标准输入中读到了EOF (Ctrl + d)和break命令。而不由commands的退出状态决定。
可以参考以下方式来"强迫"输入正确的选项才能退出select,然后再根据var变量的值进行后面的处理。

$ select var in a b c d; do [ -n "$var" ] && echo you select $var &&break; done

或者更友好的方式

$ select var in a b c d; do ([ -n "$var" ] || ! echo please select right option ) && echo you select $var && break; done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值