Bash

bash 腳本從外部文件載入修改數組

  • April 26, 2018

我編寫了一個腳本,它正在讀取一個數組:recentdirs ,其目錄名稱來自一個名為****defaults.cfg的外部配置文件,使用者可以從列表中選擇一個目錄,也可以輸入一個新目錄。如果使用者輸入一個新目錄,我希望將其儲存為數組recentdirs中的第一個位置,並保存回配置文件defaults.cfg中。該腳本能夠以目前形式執行此操作,但它正在覆蓋文件defaults.cfg並因此失去了我想儲存在其中的所有其他值。我玩過“>>”,但隨後數組將被添加到文件的末尾而不是修改。

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

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

你應該更換

grep ^recentdirs > defaults.cfg

sexp="s[^recentdirs.*[recentdirs=(${newdir[@]} ${recentdirs[@]})["
sed -i -e "$sexp" defaults.cfg

引用自:https://unix.stackexchange.com/questions/440188