Você deve substituir
grep ^recentdirs > defaults.cfg
com
sexp="s[^recentdirs.*[recentdirs=(${newdir[@]} ${recentdirs[@]})["
sed -i -e "$sexp" defaults.cfg
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
Tags bash text-processing array