외부 파일에서 수정된 배열을 로드하는 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

관련 정보