如何让Bash脚本自动添加带索引数组元素并持久化到脚本文件
实现Bash脚本关联数组数据持久化
现有一段Bash脚本可自动向关联数组DATA中添加sidN格式索引的新值,但数据仅在脚本运行时有效,退出后即丢失。需求是:添加新元素时,同时将DATA[sidN]='新值'格式的代码写入脚本文件本身,实现数据持久化。
原脚本代码
#!/bin/bash declare -A DATA DATA[sid0]='aaaa' DATA[sid1]='bbbb' DATA[sid2]='cccc' function newserver { sidtotal=0 indexcount=0 for indexcount in "${!DATA[@]}" do if [[ $indexcount == sid* ]] then sidtotal=$((sidtotal+1)) fi done read -p "Name: " id DATA["sid$((sidtotal))"]=$id echo ${DATA[@]} echo sidtotal= $sidtotal read -p "Would like do add more data? [y - n]" MOREDATA } newserver while [ "$MOREDATA" == y ];do newserver done
修改后的持久化版本
#!/bin/bash declare -A DATA DATA[sid0]='aaaa' DATA[sid1]='bbbb' DATA[sid2]='cccc' function newserver { # 获取脚本自身路径 local SCRIPT_FILE="${BASH_SOURCE[0]}" # 计算下一个sid的编号:提取现有sid的数字,取最大值加1 local sidtotal=0 for index in "${!DATA[@]}"; do if [[ $index =~ ^sid([0-9]+)$ ]]; then local num=${BASH_REMATCH[1]} if (( num >= sidtotal )); then sidtotal=$((num + 1)) fi fi done # 读取用户输入 read -p "Name: " id # 转义输入中的单引号,避免写入脚本时语法错误 local escaped_id="${id//\'/\'\\\'\'}" # 添加到数组 DATA["sid$sidtotal"]="$id" # 定位脚本中最后一行DATA[sid*]的行号 local last_data_line=$(grep -n "^DATA\[sid" "$SCRIPT_FILE" | tail -n1 | cut -d: -f1) # 插入新的DATA赋值行到脚本中 sed -i "${last_data_line}a DATA[sid$sidtotal]='${escaped_id}'" "$SCRIPT_FILE" # 输出当前数组内容和编号 echo "当前数组内容:${DATA[@]}" echo "新添加的sid编号:sid$sidtotal" # 询问是否继续添加 read -p "是否继续添加数据?[y - n]" MOREDATA } newserver while [ "$MOREDATA" == y ]; do newserver done
关键改动说明
- 获取脚本路径:用
${BASH_SOURCE[0]}获取当前脚本的路径,确保能正确定位并修改脚本文件。 - 优化sid编号计算:通过正则提取现有
sidN中的数字,取最大值加1,避免因删除元素导致的编号混乱。 - 转义特殊字符:对用户输入中的单引号进行转义处理,防止写入脚本后出现语法错误。
- 写入脚本逻辑:用
grep找到最后一行DATA[sid*]的行号,再通过sed在该行下方插入新的赋值语句,保证下次运行脚本时能加载新数据。
内容的提问来源于stack exchange,提问作者Yohrannes Santos Bigoli
相关产品推荐
相关产品推荐

