确保输出语法正确太迂腐?

时间:2014-11-06 17:24:29

标签: bash coding-style standards

假设我有一个bash脚本,它计算正在使用的索引和表的数量,并将其显示给用户。最直接的输出显然是

echo ${numIndices} Indices
echo ${numTables} Tables

但是对于某些情况,输出在语法上是不正确的,例如1索引和1表将输出为

1 Indices
1 Tables

因此,涵盖所有案例的解决方案将是

if [[ ${numIndices} -eq 0 && ${numTables} -eq 0 ]]; then
    echo ${numIndices} Indices
    echo ${numTables} Tables
elif [[ ${numIndices} -eq 0 && ${numTables} -eq 1 ]]; then
    echo ${numIndices} Indices
    echo ${numTables} Table
elif [[ ${numIndices} -eq 0 && ${numTables} -gt 1 ]]; then
    echo ${numIndices} Indices
    echo ${numTables} Tables
elif [[ ${numIndices} -eq 1 && ${numTables} -eq 0 ]]; then
    echo ${numIndices} Index
    echo ${numTables} Tables
elif [[ ${numIndices} -eq 1 && ${numTables} -eq 1 ]]; then
    echo ${numIndices} Index
    echo ${numTables} Table
elif [[ ${numIndices} -eq 1 && ${numTables} -gt 1 ]]; then
    echo ${numIndices} Index
    echo ${numTables} Tables
elif [[ ${numIndices} -gt 1 && ${numTables} -eq 0 ]]; then
    echo ${numIndices} Indices
    echo ${numTables} Table
elif [[ ${numIndices} -gt 1 && ${numTables} -eq 1 ]]; then
    echo ${numIndices} Indices
    echo ${numTables} Table
elif [[ ${numIndices} -gt 1 && ${numTables} -gt 1 ]]; then
    echo ${numIndices} Indices
    echo ${numTables} Tables
fi

这样的事情是否会被认为过于迂腐/低效/难以理解,而且在编程时通常不赞成?

4 个答案:

答案 0 :(得分:4)

写一个函数:

plural(){
    if [[ $1 -eq 1 ]]
    then
        echo "$1 $2"
    else
        echo "$1 $3"
    fi
}

然后你可以这样做:

plural "${numIndices}" Index Indices
plural "${numTables}" Table Tables

答案 1 :(得分:3)

这还取决于本地化需求。如果您的代码需要支持多种语言(现在或最终)的输出,那么英语的硬编码规则就是一种浪费,尤其是因为许多其他语言的规则将变得更复杂。

答案 2 :(得分:2)

你需要更好的实现,如下所示:

echo_count(){
  if [ "$1" = 1 ]; then
    echo $1 $2
  else
    echo $1 $3
  fi
}
echo_count 1 Index Indices
echo_count 2 Table Tables

输出

1 Index
2 Tables

答案 3 :(得分:2)

如果您不写拉丁文,

“索引”是可接受的索引复数。我不担心使用完全正确的形式,只需输出

1 Table(s)
1 Index(es)

如果您确实想要迂腐,请分别处理每个案例。您的if语句有很多冗余案例。

if [[ $numTables -eq 1 ]]; then
    echo "1 Table"
else
    echo "$numTables Tables"
fi
if [[ $numIndices -eq 1 ]]; then
    echo "1 Index"
else
    echo "$numTables Indices"
fi

或某些oneliners

[[ $numTables -eq 1 ]] && echo "1 Table" || echo "$numTables Tables"
[[ $numIndices eq 1 ]] && echo "1 Index" || echo "$numIndices Indices"