배열을 읽는 스크립트를 작성했습니다.최근 디렉토리디렉터리 이름은 다음 이름의 외부 구성 파일에서 가져옵니다.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