You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中循环收集用户输入并循环访问这些输入?

解决Bash中动态访问循环创建变量的问题

你遇到的问题其实是Bash变量扩展逻辑导致的:当你写"$str$i"时,Bash会先尝试解析$str(这个变量你没定义,所以是空值),然后拼接上$i的数值,所以最终输出的就是0、1;而"str$i"只是输出字面字符串,不是变量的值。下面给你两种解决方案,其中更推荐的是数组方案,更符合Bash的使用习惯。

方案一:用间接引用访问现有变量

如果你坚持要保留str0、str1这类单独的变量,可以用Bash的间接扩展语法${!varname}来动态获取变量值。具体做法是先把要访问的变量名拼接成一个字符串,再通过间接扩展获取它的内容:

修改你的第二个循环部分:

for (( i=0; i<num; i++ ))
do
    # 先拼接出变量名,比如str0、str1
    var_name="str$i"
    # 用${!var_name}间接获取变量值
    echo "${!var_name}"
done

这样运行后,第二个循环就能正确输出qwe和asd了。这里的${!var_name}表示:取var_name变量的内容作为新的变量名,然后返回这个新变量的值。

方案二:使用数组(更推荐)

其实在Bash中,处理这种需要存储多个同类值的场景,数组是更合适的选择——它不需要你手动拼接变量名,代码可读性更高,操作也更灵活。

改写后的完整代码:

#!/bin/bash
read -p "How many variables to loop?: " num
# 声明一个空数组(Bash 4.0+可以省略declare,直接用)
declare -a str_array

for (( i=0; i<num; i++ ))
do
    read -p "Enter no. $((i+1)) string: " input
    # 将输入的内容添加到数组末尾
    str_array+=("$input")
done

# 验证数组内容(可选)
echo "数组中的元素:"
echo "${str_array[@]}"

echo ++++++++++++++++++++
# 方式一:通过索引遍历数组
for (( i=0; i<num; i++ ))
do
    echo "${str_array[$i]}"
done

# 方式二:直接遍历数组的每个元素(更简洁)
echo ++++++++++++++++++++
for elem in "${str_array[@]}"
do
    echo "$elem"
done

数组方案的优势:

  • 不需要手动管理str0、str1这类变量名,避免拼写错误;
  • 可以直接用${str_array[@]}获取所有元素,用${#str_array[@]}获取元素个数(甚至不需要单独保存num变量);
  • 代码逻辑更清晰,符合Shell脚本的最佳实践。

另外提一句:你代码里的$[i+1]是比较旧的算术扩展语法,推荐换成标准的$((i+1)),在Bash 5.x中两者都能工作,但后者的兼容性和可读性更好。

内容的提问来源于stack exchange,提问作者bennettnw2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:23:10