bash script carrega uma matriz de modificação do arquivo externo

0

Eu escrevi um script que está lendo uma matriz: recentdirs com nomes de diretório de um arquivo de configuração externo chamado: defaults.cfg e o usuário pode escolher um dos os diretórios da lista ou digite um novo. Se o usuário inserir um novo diretório, quero que ele seja armazenado como a primeira posição na matriz recentdirs e salvo novamente no arquivo de configuração defaults.cfg . O script é capaz de fazer isso, MAS no formulário atual ele sobrescreve o arquivo defaults.cfg e, assim, perde todos os outros valores que gostaria de armazenar nele. Eu joguei com "> >" mas, em seguida, a matriz será adicionada ao final do arquivo em vez de modificada.

directory_select.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

Conteúdo do defaults.cfg

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

EDIT Versão de trabalho:

#!/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
    
por Mike 26.04.2018 / 14:01

1 resposta

0

Você deve substituir

grep ^recentdirs > defaults.cfg

com

sexp="s[^recentdirs.*[recentdirs=(${newdir[@]} ${recentdirs[@]})["
sed -i -e "$sexp" defaults.cfg
    
por 26.04.2018 / 15:06