如何在Shell循环中为从文件读取的变量名赋值?
解决动态变量名赋值问题
你原来的写法无法工作的原因是:shell会把$i=xxx解析为执行一个名为$i值的命令,而不是给$i指向的变量名赋值。比如当i=ID1时,shell会尝试执行ID1=xxx这个“命令”,但这不是合法的赋值语法(赋值时变量名前不能加$)。
以下是几种可行的解决方法:
方法1:使用declare命令(推荐)
declare可以直接动态创建并赋值变量,语法简单且安全:
从文件读取变量名的循环
while IFS= read -r id_name; do declare "$id_name=$(cat /proc/sys/kernel/random/uuid)" done < ids.txt
直接指定变量名的循环
for id_name in ID1 ID2 ID3; do declare "$id_name=$(cat /proc/sys/kernel/random/uuid)" done
方法2:使用printf -v命令(更安全)
printf -v可以直接将输出内容赋值给指定变量,完全避免eval带来的安全风险:
while IFS= read -r id_name; do printf -v "$id_name" "%s" "$(cat /proc/sys/kernel/random/uuid)" done < ids.txt
方法3:使用eval命令(需注意安全)
eval会把字符串作为shell命令执行,适合简单场景,但如果变量名包含特殊字符可能出现风险:
while IFS= read -r id_name; do eval "$id_name=$(cat /proc/sys/kernel/random/uuid)" done < ids.txt
验证效果
执行完脚本后,直接用echo输出变量即可得到对应UUID:
echo $ID1 echo $ID2 echo $ID3
注意事项
- 用
while IFS= read -r代替for i incat ids.txt``,可以避免变量名包含空格、换行等特殊字符时出现异常; IFS=用于保留行首行尾的空格,-r参数禁止转义反斜杠,确保读取内容的准确性。
内容的提问来源于stack exchange,提问作者Pipiloski
相关产品推荐
相关产品推荐

