2016-05-23 8 views
-1

http://pastebin.com/P46B7Zcyバッシュ変数代入はライン72 pritnsで

#!/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 

エコー機能しない何かWYNIKが空ではないが、その後ライン77には、なぜ、何も毎回印刷していませんか?

+2

問題を再現する[* minimal * example](http://www.sscce.org)を投稿してください。 – chepner

+0

これはBashFAQ#24です:http://mywiki.wooledge.org/BashFAQ/024 –

答えて

0

ループにパイプすると、そのループはサブシェルで実行されます。

の代わりに:

... | while read; do 
done 

実行:

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

...サブシェルの中に一人で...を入れ、メインシェルの中にループの内容を置きます。余談として、


findを使用して、あなたのコードを壊すことができない改行リテラルと-print0IFS= read -r -d ''ので、名前を使用してください。つまり、

0

あなたの問題は、find | whileを使用してサブシェルを作成することです。サブシェルの変更は親シェルで失われます。

while read -r line; do 
    commands 
done < <(find command) 
0

WYNIK

使用すると、最初に空の文字列が割り当てられます。

空文字列を印刷する理由は、bashがすべてのパイプラインと同様に| while ... doneブロックを実行するためのサブシェルを作成するためです。

サブシェル内の変数の変更は、親シェルに影響を与えません。

サブシェルは変数を継承します。 WYNIKに値が割り当てられている場合、72行目はまだサブシェル内に位置しているため、72行目に出力できます。

done(外側のサブシェル)の後、親シェルに戻って、行77は、WYNIKの値を変更しないでください:空の文字列を出力します。

+0

「| 'lastpipe'フラグが有効になっていなければ(そしてその使用のための前提条件が満たされていない限り)、' **すべて** **パイプラインです。あなたが外部コマンドにパイプしているとしても、その外部コマンドが 'exec'される前に、サブシェルはしばらくフォークされます。 –

+0

本当に、私は彼のスクリプトを説明しようとしました。私は私の答えを変更します。私は 'lastpipe'と前提条件について知らない。どうも! –