Bash
如何在 bash 中實現類似於“apt search”的搜尋
我正在編寫一個 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我認為這有助於理解我想要做什麼。
我希望這可以被接受為答案。
你的算法應該是:
- 查找名稱中包含搜尋字元串的目錄。如果找到,列印目錄名稱和
cat
相應的描述。例如:
for dir in *${SEARCHSTRING}* do echo $dir cat "$dir/description" done
- 在所有其他目錄中,找到包含搜尋字元串的*描述。*如果找到,請參見上文。
例如:
for dir in * do if [[ $dir != *${SEARCHSTRING}* ]] then if grep -q "$SEARCHSTRING" then echo $dir cat "$dir/$SEARCHSTRING" fi fi done
這兩個循環可以毫不費力地合二為一。警告:我只是將它們放在一起而沒有測試,也沒有使它們適應您現有的程序。
你的算法實際上做了什麼:
- 查找包含搜尋字元串的目錄。然後是該搜尋結果的
cat
所有描述和 grep,即使該結果為空。至少有兩個不想要的後果: 當搜尋一個不存在的目錄時,所有的東西都會被列印出來。此外,僅列印包含搜尋字元串的描述行。- 您沒有解決描述而不是目錄包含搜尋字元串的情況。
這不能通過更改一兩行來解決。我認為需要重新設計。