UNIX/Bash脚本实现3个输入姓名按字母序排序及现有代码报错修复
问题排查与解决方案
现有代码问题排查
- 顶层两个
if判断为独立关系,没有做互斥处理,会出现无输出或同时输出两次排序结果的问题:比如输入第一个名字为Zoe时,n1字符串序大于n2和n3,两个顶层if的条件都不满足,没有任何输出;如果两个顶层if条件同时成立,会连续输出两次结果,导致内容混乱。 - 分支逻辑覆盖不全,三个名字排序共有6种排列组合,现有嵌套判断没有覆盖所有场景,部分输入无法得到正确结果。
正确实现方案
方案1:极简实现(借助sort命令,无需复杂判断)
代码量少、出错概率低,适合实际生产场景使用:
#!/bin/bash names=() # 循环读取3个输入存入数组 for i in {1..3}; do read -p "Enter a friend's name: " name names+=("$name") done # 按字母序排序后空格分隔输出 printf "%s\n" "${names[@]}" | sort | tr '\n' ' ' echo
方案2:修正嵌套判断逻辑
如果必须用条件判断实现,可以将顶层分支改为互斥逻辑,覆盖所有排列场景:
#!/bin/bash echo -n "Enter a friend's name: " read n1 echo -n "Enter another friend's name: " read n2 echo -n "Enter a third friend's name: " read n3 if [[ $n1 < $n2 && $n1 < $n3 ]]; then # n1为最小值 if [[ $n2 < $n3 ]]; then echo "$n1 $n2 $n3" else echo "$n1 $n3 $n2" fi elif [[ $n2 < $n1 && $n2 < $n3 ]]; then # n2为最小值 if [[ $n1 < $n3 ]]; then echo "$n2 $n1 $n3" else echo "$n2 $n3 $n1" fi else # n3为最小值 if [[ $n1 < $n2 ]]; then echo "$n3 $n1 $n2" else echo "$n3 $n2 $n1" fi fi
内容的提问来源于stack exchange,提问作者PYTHONNOOB
相关产品推荐
相关产品推荐

