Bash脚本for循环中无法将文件内容赋值给动态变量问题求助
Bash动态变量名赋值问题修复方案
错误原因
你当前的写法将整段赋值语句作为字符串提交给Shell执行,Shell会将其识别为待调用的命令,因此抛出command not found错误。此外你生成的变量名包含.符号,不符合Bash变量名仅能使用字母、数字、下划线的命名规则,本身也会导致赋值失败。
修复方案
方案1:使用printf -v实现(兼容性最优,支持所有Bash 3及以上版本)
这是最通用的实现方式,无需依赖高版本Bash特性:
# 声明存储文件名的数组 declare -a file_array=("one.txt" "two.txt" "three.txt" "four.json" "five.txt" "six.txt") for file in "${file_array[@]}" do echo "$file" # 先拉取文件内容到临时变量,避免特殊符号转义问题 file_content=$(curl -k -s -X GET -H "${var1}" -H "${var2}" "${var3}${var4}") # 生成合法变量名(替换.为下划线),直接通过printf -v赋值 printf -v "file_${file//./_}" '%s' "$file_content" done
赋值完成后可通过echo "$file_one_txt"获取one.txt的内容,其余文件以此类推。
方案2:使用nameref名称引用实现(仅支持Bash 4.3及以上版本)
如果运行环境Bash版本较高,也可以用名称引用的方式实现:
declare -a file_array=("one.txt" "two.txt" "three.txt" "four.json" "five.txt" "six.txt") for file in "${file_array[@]}" do echo "$file" var_name="file_${file//./_}" # 声明引用指向目标变量 declare -n target_var="$var_name" # 给引用赋值等价于给目标变量赋值 target_var=$(curl -k -s -X GET -H "${var1}" -H "${var2}" "${var3}${var4}") # 取消引用绑定,避免循环复用冲突 unset -n target_var done
内容的提问来源于stack exchange,提问作者Victor.Bbb
相关产品推荐
相关产品推荐

