if控制结构功能异常,Shell脚本运行故障求助
Shell脚本问题修复
先看你脚本里的几个核心问题:
- 用
$#判断输入的名字数量完全错了,$#是指脚本启动时传入的参数个数,不是你用read读取的输入内容的个数,这就是为啥你第一次正确输入还会重复提示的原因。 read -r names只会把输入当成单个字符串存起来,没法拆成数组,所以后面用${names[0]}根本取不到值。$(sort) "$names"的写法完全不符合sort的用法,没法实现排序。- 错误分支只重新读取一次输入,没做循环判断,所以第二次输错直接就退出了。
修复后的完整脚本:
#!/bin/bash # 循环获取输入,直到用户输入3个名字 while true; do echo "Provide Three Names: " read -r -a names # -a 参数把输入存为数组,空格分隔内容 # 判断数组长度是否为3 if [ "${#names[@]}" -ne 3 ]; then echo "Error: 请输入三个名字,重新输入" continue else break fi done # 对数组内容进行字典序排序,存回新数组 sorted_names=($(printf "%s\n" "${names[@]}" | sort)) # 输出排序后的结果 echo "Names in order are: " echo "${sorted_names[0]}" echo "${sorted_names[1]}" echo "${sorted_names[2]}"
逐个解释修复点:
- 循环获取输入:用
while true循环,直到用户输入符合要求才跳出,解决了只重试一次就退出的问题。 - 读取为数组:
read -r -a names里的-a参数会把用户输入的空格分隔内容自动存成数组,这样就能用${#names[@]}获取数组的元素个数,判断是否为3。 - 正确实现排序:用
printf "%s\n" "${names[@]}"把数组每个元素按行输出,传给sort命令排序,再把排序结果存回新数组sorted_names,避免破坏原输入数组。 - 正确判断输入数量:用
${#names[@]}获取数组长度,代替原来的$#,这才是判断read输入元素个数的正确方式。
内容的提问来源于stack exchange,提问作者Dragoon
相关产品推荐
相关产品推荐

