bash脚本从外部文件加载修改数组

bash脚本从外部文件加载修改数组

我编写了一个读取数组的脚本:最近的目录目录名称来自外部配置文件,名为:默认值.cfg用户可以从列表中选择一个目录或输入一个新目录。如果用户输入一个新目录,我希望将其存储为数组中的第一个位置最近的目录并保存回配置文件中默认值.cfg。该脚本能够执行此操作,但在当前形式下它会覆盖该文件默认值.cfg从而失去了我想存储在其中的所有其他值。我玩过“>>”,但随后数组将被添加到文件末尾而不是被修改。

目录选择.sh

#!/bin/bash
number=0

source defaults.cfg

for i in "${recentdirs[@]}"
do
   #only show the last 5 directories
    if [ $number -le 5 ]
    then
            echo "$number - $i"
            number=$((number+1))
    else
            break
    fi
done

read selection

#check if number or string was entered
regpat='^[0-9]+$'
if ! [[ $selection =~ $regpat ]]
then
    newdir=( ${selection} )

    #merge arrays to have the new entry at the first position
    recentdirs=("${newdir[@]}" "${recentdirs[@]}")

    #write array back into file
    set | grep ^recentdirs > defaults.cfg
else
    echo ${recentdirs[$selection]}
fi

defaults.cfg 的内容

recentdirs=([0]="/new/folder/" [1]="/folderA/folder1/" [2]="/folderB/folder2/" [3]="/folderX/folder5")

编辑工作版本:

#!/bin/bash
number=0
source defaults.cfg

for i in "${recentdirs[@]}"
do
   #only show the last 5 directories
    if [ $number -le 5 ]
    then
            echo "$number - $i"
            number=$((number+1))
    else
            break
    fi
done

read selection

#check if number or string was entered
regpat='^[0-9]+$'
if ! [[ $selection =~ $regpat ]]
then
    newdir=( ${selection} )

    #merge and write array back into file with sed
    sexp="s[^recentdirs.*[recentdirs=(${newdir[@]} ${recentdirs[@]})["
    sed -i -e "$sexp" defaults.cfg

else
    echo ${recentdirs[$selection]}
fi

答案1

你应该更换

grep ^recentdirs > defaults.cfg

sexp="s[^recentdirs.*[recentdirs=(${newdir[@]} ${recentdirs[@]})["
sed -i -e "$sexp" defaults.cfg

相关内容