如何在Shell的case语句中处理变量多值分配以实现多输入多输出?
解决Shell脚本数字转英文单词的问题
首先,咱们来看看你原来代码里的几个小问题:
- 你用
read -p "1-8" one two three four five six seven eight指定了8个变量,但如果用户输入的数字少于8个,后面的变量就会是空值,最后数组里会混入空元素,影响后续处理。 case $all in这里的$all是把整个数组当成一个字符串来判断(比如输入1 3 5的话,$all就是1 3 5),case根本没法匹配单个数字,自然没法输出多个对应的单词。
接下来给你两种可行的实现方式,你可以根据需求选:
方法一:用关联数组映射(推荐,易扩展)
关联数组可以直接把数字和对应的英文单词绑定,遍历输入的每个数字就能轻松转换:
#!/bin/bash # 定义数字到英文单词的关联数组 declare -A num_to_word=( [1]="one" [2]="two" [3]="three" [4]="four" [5]="five" [6]="six" [7]="seven" [8]="eight" ) # 读取用户输入,自动拆分成数组 read -p "请输入1-8范围内的1至8个不同数值(空格分隔):" -a input_nums # 遍历数组中的每个数字 for num in "${input_nums[@]}"; do # 检查数字是否在1-8范围内 if [[ "$num" =~ ^[1-8]$ ]]; then echo -n "${num_to_word[$num]} " else echo -n "无效输入($num) " fi done echo # 换行
方法二:用case循环处理每个元素
如果不想用关联数组,也可以遍历每个输入元素,用case逐个判断:
#!/bin/bash read -p "请输入1-8范围内的1至8个不同数值(空格分隔):" -a input_nums for num in "${input_nums[@]}"; do case "$num" in 1) echo -n "one ";; 2) echo -n "two ";; 3) echo -n "three ";; 4) echo -n "four ";; 5) echo -n "five ";; 6) echo -n "six ";; 7) echo -n "seven ";; 8) echo -n "eight ";; *) echo -n "无效输入($num) ";; esac done echo # 换行
测试一下
比如输入1 3 5,两种方法都会输出:one three five
两种方法都处理了输入的每个元素,还能识别无效输入(比如输入9的话会提示无效),比原来的代码更健壮。
内容的提问来源于stack exchange,提问作者Damian Chan
相关产品推荐
相关产品推荐

