外部ファイルから変更された配列をロードするbashスクリプト

外部ファイルから変更された配列をロードするbashスクリプト

配列を読み取るスクリプトを作成しました。最近のディレクトリディレクトリ名は、次の名前の外部設定ファイルから取得されます。default.cfgユーザーはリストからディレクトリを選択するか、新しいディレクトリを入力できます。ユーザーが新しいディレクトリを入力したら、そのディレクトリを配列の最初の場所として保存したいと思います。最近のディレクトリ設定ファイルに再度保存します。default.cfg。スクリプトはこれを実行できますが、現在の形式ではファイルを上書きします。default.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

関連情報