Bash变量赋值不起作用

时间:2016-05-23 20:28:55

标签: bash

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ł: $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行它每次都没有打印,为什么?

3 个答案:

答案 0 :(得分:0)

当你进入循环时,该循环在子shell中运行。

而不是:

... | while read; do
done

运行:

while read; do
done < <(...)

...将...单独放入子shell中,并将循环的内容放入主shell中。

另外,在使用find时,请确保使用-print0IFS= 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值,未修改:空字符串。