Bash中通过循环创建动态命名变量的问题与解决
如何在Bash循环中创建带数字后缀的动态变量
问题场景
需要从文本文件逐行读取内容,分别赋值给naam1、naam2这类带数字后缀的变量。
首先创建测试文件naam.txt:
echo "John " > naam.txt echo "Susan " >> naam.txt echo "Nicole " >> naam.txt echo "Betsy " >> naam.txt
最初采用手动赋值的方式可实现需求,但变量数量较多时操作繁琐:
naam1=$(sed -n 1"p" naam.txt) naam2=$(sed -n 2"p" naam.txt) naam3=$(sed -n 3"p" naam.txt) naam4=$(sed -n 4"p" naam.txt) echo $naam1 echo $naam3 echo $naam2 echo $naam4
失败的循环尝试
尝试用循环简化赋值,但直接使用naam$var=...的写法无法生效:
for var in 1 2 3 4 do naam$var=$(sed -n $var"p" naam.txt) done echo $naam1 $naam4
原因是Bash的变量解析顺序限制,左侧的naam$var不会被正确解析为动态变量名,导致赋值失败。
解决方法:使用printf -v命令
Bash的printf -v命令支持将输出结果直接赋值给指定名称的变量,可完美解决动态变量赋值问题:
num=5 # 需要创建的变量数量 for (( i = 1; i <= $num; i++ )) do CONFIG_OPTION="naam$i" # 定义动态变量名 CONFIG_VALUE=$(sed -n $i"p" naam.txt) # 从文件读取对应行的内容 printf -v "$CONFIG_OPTION" "%s" "$CONFIG_VALUE" # 将值赋值给动态变量 done # 生成测试文件(若未提前创建) echo "John " > naam.txt echo "Susan " >> naam.txt echo "Nicole " >> naam.txt echo "Betsy " >> naam.txt # 输出变量值验证结果 echo "1 $naam1" echo "2 $naam2" echo "3 $naam3" echo "4 $naam4" echo "5 $naam5" echo "6 $naam6" # 未赋值的变量会输出空值
关键说明
printf -v var_name format value 会将按format格式化后的value赋值给var_name,此处用%s作为格式符,直接将读取到的文本内容赋值给动态生成的变量名。
内容的提问来源于stack exchange,提问作者user20589826
相关产品推荐
相关产品推荐

