2010-12-03 19 views
1

私はイントロスクリプトの割り当てに取り組んでおり、スクリプト内で関数を呼び出す際に問題が発生しています。私は課題の2番目の部分にいます。私は自分のものが確実に働くようにテストしています(うまくいけば)。私はいくつかのディレクトリを集め、イエスかノーの質問をします。私が「y」を取得すると、私は小さな関数を書いています。私が「n」を取得すると、別の関数、単純なエコーが両方ともあります。どうした?bashスクリプト内で関数を呼び出す際に問題が発生する

part_two(){ 
    answer="" 
    for value in "[email protected]";do 
     echo "$value" 
     while [ "$answer" != "y" -a "$answer" != "n" ] 
     do 
     echo -n "Would you like to save the results to a file? (y/n): " 
     read answer 
     done 
     if [ "$answer" = "n" ] 
     then 
      part_six 
     elif [ "$answer" = "y" ] 
     then 
      part_five 
     fi 
    done 
} 

part_two [email protected] 

part_five(){ 
    echo -n "working yes"; 
} 

part_six(){ 
    echo -n "working no"; 
} 

いつものように助けていただければ幸いです。

+1

ご迷惑をおかけして申し訳ございませんが、ご了承ください。 – SiegeX

答えて

9

C言語と同様に、関数を使用する前に定義する必要があります。コードスニペットでは、2つの関数を宣言する前にpart_two(part_fiveとpart_sixを呼び出しています)を呼び出しています。

定義をスクリプトの先頭に移動しようとしましたか?

EDIT:

ほとんどの場合、バッシュでこれに対処するための最良の方法は、単に任意の実際のコマンドを実行する前にスクリプトの開始時にすべての機能を定義することです。定義の順序は本当に重要ではありません。シェルは関数を使用しようとしているときにのみ関数を検索します。したがって、一般的に考える必要のない依存性の問題などはありません。

EDIT 2:あり

はあなただけで、スクリプトの先頭で関数を定義することができないかもしれない例です。あなたが動的に選択したり、機能e..g:の宣言ますは、各関数の呼び出しはその関数の後に起こることを確認する必要がありこれらのケースでは

if [[ "$1" = 0 ]]; then 
    function show() { 
     echo Zero 
    } 
else 
    function show() { 
     echo Not-zero 
    } 
fi 

を修正するために、条件付き構文を使用する場合の一般的なケースがあります(およびそれが呼び出す他のもの)が宣言されています。

EDIT 3:bashで

関数宣言は、実際にあなたがその実装を定義function foo() { ... }ブロックである - はい、functionキーワードは厳密には必要ではありません。 Cのように関数プロトタイプはありません。シェルスクリプトは一般的に実行されると解析されるため、意味をなさないでしょう。 Newer Bashのバージョンでは、一度にスクリプトを読み込んでいますが、ほとんどの場合、構文エラーをチェックし、このような論理エラーはチェックしません。

公用語は "function 宣言"ですが、Bash情報ページでも "宣言"と "定義"を同じ意味で使用しています。

+0

ありがとうございます。私たちは授業中の機能に触れましたが、瞬間にしか定義する必要がないことを認識していませんでした。 – mrwienerdog

+0

@mrwienerdog:つまり、この行を一番下に移動します: 'part_two $ @'。 –

関連する問題