#!/bin/bash
KONIEC=0
WYSZ="Wyszukiwarka"
NAZWA=""
KATALOG="."
ZAWARTOSC=""
ROZMIAR=""
CZAS=""
USER=""
SZUKAJ=""
LICZ=0
WYNIK=""
POMOC=0
while [ $KONIEC -ne 8 ]; do
informacja="Tytuł: $NAZWA\nKatalog: $KATALOG\nRozmiar: $ROZMIAR\nArtysta: $USER\nRok wydania: $CZAS\nContent type: $ZAWARTOSC\nRezultat: $SZUKAJ";
menu=("Tytuł" "Katalog" "Rozmiar" "Artysta" "Rok wydania" "Content type" "KONIEC")
opt=$(zenity --list --height 360 --title=$WYSZ --text="$informacja" --cancel-label "WYSZUKAJ" --ok-label "Wybierz opcję" --column="Menu główne" "${menu[@]}")
if [ $? -eq 1 ]; then
find $KATALOG -type f -iname \*.mp3 | while read -r line ; do
name=${line##*/}
POMOC=0
if [ -n "$NAZWA" ]; then
POLECENIE=' '$NAZWA
TYTUL=$(id3info $name | grep TIT2 | cut -d ":" -f 2)
if [ "$POLECENIE" == "$TYTUL" ];then
POMOC=1
else
POMOC=2
fi
fi
echo $POMOC
if [ $POMOC -ne 2 ];then
if [ -n "$USER" ]; then
POLECENIE=' '$USER
TYTUL=$(id3info $name | grep TPE1 | cut -d ":" -f 2)
if [ "$POLECENIE" == "$TYTUL" ]
then
POMOC=1
else
POMOC=2
fi
fi
fi
if [ $POMOC -ne 2 ];then
if [ -n "$ZAWARTOSC" ]; then
POLECENIE=' '$ZAWARTOSC
TYTUL=$(id3info $name | grep TCON | cut -d ":" -f 2)
if [ "$POLECENIE" == "$TYTUL" ]
then
POMOC=1
else
POMOC=2
fi
fi
fi
if [ $POMOC -ne 2 ];then
if [ -n "$CZAS" ]; then
POLECENIE=' '$CZAS
TYTUL=$(id3info $name | grep TYER | cut -d ":" -f 2)
if [ "$POLECENIE" == "$TYTUL" ]
then
POMOC=1
else
POMOC=2
fi
fi
fi
if [ $POMOC -eq 1 ]; then
WYNIK=$name
echo "$WYNIK" # Line 72
fi
done
echo "$WYNIK" # Line 77
zenity --info --title $WYSZ --text "$WYNIK"
fi
case "$opt" in
"${menu[0]}" )
NAZWA=$(zenity --entry --title $WYSZ --text "Podaj tytuł:" --height 120)
;;
"${menu[1]}" )
KATALOG=$(zenity --entry --title $WYSZ --text "Podaj katalog:" --height 120)
;;
"${menu[2]}" )
ROZMIAR=$(zenity --entry --title $WYSZ --text "Podaj rozmiar pliku:" --height 120)
;;
"${menu[3]}" )
USER=$(zenity --entry --title $WYSZ --text "Podaj wykonawce:" --height 120)
;;
"${menu[4]}" )
CZAS=$(zenity --entry --title $WYSZ --text "Podaj rok wydania:" --height 120)
;;
"${menu[5]}" )
ZAWARTOSC=$(zenity --entry --title $WYSZ --text "Podaj content type:" --height 120)
;;
"${menu[6]}" )
KONIEC=8
esac
done
第72行的Echo在WYNIK不为空的时候会提供一些东西,但是在77行它每次都没有打印,为什么?
答案 0 :(得分:0)
当你进入循环时,该循环在子shell中运行。
而不是:
... | while read; do
done
运行:
while read; do
done < <(...)
...将...
单独放入子shell中,并将循环的内容放入主shell中。
另外,在使用find
时,请确保使用-print0
和IFS= read -r -d ''
,因此使用换行文字的名称无法破坏您的代码。那就是:
while IFS= read -r -d '' filename; do
: something with "$filename"
done < <(find ... -print0)
答案 1 :(得分:0)
您的问题是您正在使用find |创建子shell,而子shell中的更改将在父shell中丢失。
使用
while read -r line; do
commands
done < <(find command)
答案 2 :(得分:0)
WYNIK
首先被分配一个空字符串。
第77行打印空字符串的原因是因为bash
创建了一个子shell来执行| while ... done
块,就像它对所有管道一样。
请记住,子shell中变量的任何修改都不会影响父shell。
子shell继承变量。为WYNIK
分配值时,第72行可以打印它,因为它仍然位于子shell中。
在done
(子shell外)之后,返回到父shell,第77行打印WYNIK
值,未修改:空字符串。