我正在编写一个 bash 脚本,它是一个“包管理器”,它使用pi 应用程序。
我想实现一个搜索功能,以便我可以搜索应用程序。现在我正在做的是这样的(模板是一个我不想列出的文件夹):
#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
- 在所有其他目录中,找到描述包含搜索字符串。如果找到,请参见上文。
例如:
for dir in *
do
if [[ $dir != *${SEARCHSTRING}* ]]
then
if grep -q "$SEARCHSTRING"
then
echo $dir
cat "$dir/$SEARCHSTRING"
fi
fi
done
这两个循环可以毫不费力地合二为一。注意:我只是将它们放在一起,没有进行测试,也没有使它们适应您现有的程序。
你的算法是什么实际上做:
- 查找包含搜索字符串的目录。然后
cat
全部描述并 grep 查找该搜索的结果,即使该结果为空。至少有两个不良后果: 当搜索不存在的目录时,所有内容都会被打印。此外,仅打印包含搜索字符串的描述行。 - 您没有解决描述(而不是目录)包含搜索字符串的情况。
这不能通过更改一两行来解决。我认为需要重新设计。