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

相关内容

  • 没有找到相关文章

最新更新