关于在bash中编写便携式和通用的确认功能:在bash中编写便携式和通用的确认功能 – 你能改进它吗?

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)


confirm的退出状态只是最后执行的命令的退出状态。这意味着你所需要做的就是以[[ $ans == [$must_match] ]]结束;不管must_match是什么,如果$ans与它匹配,则返回0,如果不匹配,则返回1。

在样式说明中,我将把must_match设置为模式本身,而不是模式中出现的字符。

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 ]]
}