2012-02-15 6 views
0

ファイルが存在するかどうかをチェックするスクリプトがあります。ファイルがない場合は、スクリプトを続行するかどうかをユーザーに尋ねます。無限ループでreadコマンドを使用すると奇妙な動作が発生する

私が知りたいのは、キーボードの代わりに端末からの入力を除いてreadコマンドがあることです。

function isfileThere(){ 
    output=$(ls ${1} 2>&1 >/dev/null) 
    case $output in 
    *"No such file or directory"*) 
     echo "DS not found: $output"; 
     option_exitprog; $output >> DSNotFound.txt ;; 
    *) echo "DS found: $output";; 
    esac 
} 

function option_exitprog(){ 
    while : 
    do 
    echo -n "Would you like to continue (y/n)?" 
    read Answer 
    #read -n1 -p "Would you like to continue (y/n)?" Answer                                                     

    if [ ! -z "$Answer" ] ; then 
     if [ "$Answer" == "y" ] ; then 
      echo "Exiting script. Goodbye" 
      exit 1 
     elif [ "$Answer" == "n" ] ; then 
      echo "Continue With Program" 
      break 
     else 
      echo "We only accept (y/n)" 
     fi 
    else 
     echo "You have entered a null string. We only accept (y/n)" 
    fi 
    done 
} 

function get_TotalEventEntries(){ 

cat<<EOF                                                                 

####################################                                                          
#         #                                                          
#         #                                                          
#  get Total Entries   #                                                          
#         #                                                          
#         #                                                          
####################################                                                          

EOF                                                                   

    while read LINE 
    do 
    let total_DSNumber=total_DSNumber+1 

    #Check if files exist                                                             
    isfileThere ${FileDir}/*${LINE}*/*.root* 

    #print to file                                                               
    #printf "${LINE}=" >> ${Filename}                                                          
    #getEntries ${LINE} >> ${Filename}                                                          
    done < ${DSWildCardFile} 

    echo "Finished running over $total_DSNumber file(s)" 
} 

get_TotalEventEntries 
+0

var 'DSWildCardFile'はどこに定義されていますか?また、予想される行動が何であるかを示すためにあなたの投稿を編集すると役立つかもしれません。エラーメッセージが表示されますか?あなたは(例外の代わりに)受け入れるか期待するのですか?スクリプトの最上部に 'set -vx'を追加してデバッグを試みましたか?がんばろう。 – shellter

+0

Ditto、 'while'ループの入力は、' $ DSWildCardFile'が展開するものであれば何でも構いません。 – tripleee

+2

ファイルが存在するかどうかのチェック方法を変更する必要があります。 '[-f $ file]]'を使用してください。一般に、スクリプトの中で 'ls'を使用している場合、間違っています。 – jordanm

答えて

2

問題は、このラインである:done < ${DSWildCardFile}

は、ここに私のスクリプトです。 readと簡単なリダイレクトを使用して、このファイルから行を読み取ったり、同時にユーザーを読み取ったりすることはできません。これを修正するには、より複雑なリダイレクトと新しいファイル記述子を使用してください:

while read -u 3 LINE 
do 
    ... 
done 3< ${DSWildCardFile} 
関連する問題