http://pastebin.com/P46B7Zcy
#!/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ł: $NAZWAnKatalog: $KATALOGnRozmiar: $ROZMIARnArtysta: $USERnRok wydania: $CZASnContent type: $ZAWARTOSCnRezultat: $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
当 WYNIK 不为空时,第 72 行中的回显会提示某些内容,但是在第 77 行中,它每次都不打印任何内容,为什么?
你的问题是你正在使用find|while创建一个子shell,而子shell中的更改在父shell中丢失。
用
while read -r line; do
commands
done < <(find command)
当您通过管道进入循环时,该循环会在子 shell 中运行。
而不是:
... | while read; do
done
跑:
while read; do
done < <(...)
。它将...
单独放入子外壳中,并将循环的内容放入主外壳中。
顺便说一句,使用 find
时,请确保使用 -print0
和 IFS= read -r -d ''
,以便带有换行符文本的名称不会破坏您的代码。那是:
while IFS= read -r -d '' filename; do
: something with "$filename"
done < <(find ... -print0)
为WYNIK
分配一个空字符串。
第 77 行打印空字符串的原因是bash
创建一个子 shell 来执行| while ... done
块,就像它对所有管道所做的那样。
请记住,对子外壳中变量的任何修改在父外壳中都没有影响。
子外壳继承变量。当WYNIK
被分配一个值时,第 72 行可以打印它,因为它仍然位于子外壳中。
在done
(外部子外壳)之后,回到父外壳中,第 77 行打印WYNIK
值,未修改:空字符串。