Bash

如何在 bash 中實現類似於“apt search”的搜尋

  • March 23, 2021

我正在編寫一個 bash 腳本,它是一個使用pi-apps的“包管理器” 。

我想實現一個搜尋功能,這樣我就可以搜尋應用程序。現在我正在做的是這個(模板是一個我不想列出的文件夾):

#test-search.sh

PI_APPS_DIR="$HOME/pi-apps"

function list-all() {
   for dir in $PI_APPS_DIR/apps/*/; do
       dirname=$(basename "$dir")
       if [[ "$dirname" != "template" ]]; then
           echo -e "\n${bold}${inverted}${light_blue}$dirname${normal}"
           DESC="${green}$(cat "$dir"/description)${normal}"
           echo -e $DESC
       fi
   done
}

function search() {
   for dir in $PI_APPS_DIR/apps/*/; do
       dirname=$(basename "$dir")
       if [[ "$dirname" != "template" ]]; then
           echo "$dirname" | grep "$1"
       fi
   done
}


# the function is then called like this
if [[ "$1" == "search" ]]; then
   #search a app
   FIND="$(search "$2")"
   list-all | grep "$FIND"
fi

並像這樣執行它:(./test-search.sh search "APP"應用程序是搜尋詞)。

發生的事情是這樣的:如果搜尋詞是在應用程序的名稱及其描述中,我會得到如下資訊:

./test-search.sh search "Q"
QEMU
description.......

但如果我使用q,它只會列出所有應用程序。如果搜尋詞僅在應用程序的描述中,則僅列印描述。

文件樹如下所示:

~/pi-apps/apps 例如,裡面apps有一個文件夾,每個應用程序都以應用程序的名稱命名Zoom。有 1 個文件夾template我不想列出。

這是其他人的同一個項目,但用 python 編寫:https ://github.com/techcoder20/PiAppsTerminalAdvanced/blob/main/PiAppsTerminalAdvanced.py我認為這有助於理解我想要做什麼。

我希望這可以被接受為答案。

你的算法應該是:

  1. 查找名稱中包含搜尋字元串的目錄。如果找到,列印目錄名稱和cat相應的描述。

例如:

for dir in *${SEARCHSTRING}*
do
 echo $dir
 cat "$dir/description"
done
  1. 在所有其他目錄中,找到包含搜尋字元串的*描述。*如果找到,請參見上文。

例如:

for dir in *
do
 if [[ $dir != *${SEARCHSTRING}* ]]
 then 
   if grep -q "$SEARCHSTRING"
   then 
     echo $dir
     cat "$dir/$SEARCHSTRING"
   fi
 fi
done

這兩個循環可以毫不費力地合二為一。警告:我只是將它們放在一起而沒有測試,也沒有使它們適應您現有的程序。

你的算法實際上做了什麼:

  1. 查找包含搜尋字元串的目錄。然後是該搜尋結果的cat 所有描述和 grep,即使該結果為空。至少有兩個不想要的後果: 當搜尋一個不存在的目錄時,所有的東西都會被列印出來。此外,僅列印包含搜尋字元串的描述行。
  2. 您沒有解決描述而不是目錄包含搜尋字元串的情況。

這不能通過更改一兩行來解決。我認為需要重新設計。

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