Writing a portable and generic confirm function in bash - can you improve it?
我试图为请求输入的bash编写一个通用的"confirm"函数,并基于默认值[yy]或[nn]向调用函数返回0或1。
它有效,但是:
- 如果我以后再阅读代码,我会发现代码有点难以理解(特别是
must_match 处理逻辑) - 我不确定是否使用了不可移植函数返回值的任何特性(有许多线程在使用局部变量、eval和其他机制处理返回值)。作为另一个例子,我发现在OSXbash中,即使在今天(2019年2月)也不支持将字符串转换为小写的
${VAR,,} 。
如果这是一个好方法和/或我如何改进它,你能建议吗?
我的功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | confirm() { display_str=$1 default_ans=$2 if [[ $default_ans == 'y/N' ]] then must_match='yY' else must_match='nN' fi read -p"${display_str} [${default_ans}]:" ans if [[ $ans == [$must_match] ]] then [[ $must_match == 'yY' ]] && return 0 || return 1 else [[ $must_match == 'yY' ]] && return 1 || return 0 fi } |
我如何使用它:
1 2 | confirm 'Install Server' 'y/N' && install_es || echo 'Skipping server install' confirm 'Install hooks' 'Y/n' && install_hooks || echo 'Skipping machine learning hooks install' |
可移植性:非正式地使用这个术语,在过去的5年里,可以在流行的Linux发行版上使用。换一种方式,在Linux系统中尽可能的便携。
(我知道有关confirm函数的其他线程,但它们似乎只处理y/n)
在样式说明中,我将把
1 2 3 4 5 6 7 8 9 10 11 12 | confirm() { display_str=$1 default_ans=$2 if [[ $default_ans == 'y/N' ]] then must_match='[yY]' else must_match='[nN]' fi read -p"${display_str} [${default_ans}]:" ans [[ $ans == $must_match ]] } |