80

Ubuntu マシンでを実行しようとするとbash script、エラーが発生します。

関数が見つかりません

テストするために、ラップトップでは正常に動作するがデスクトップでは動作しない次のスクリプトを作成しました。理由についてのアイデアはありますか?それが関連している場合、私のラップトップはMacです。

#!/bin/bash

function sayIt {   
   echo "hello world"
}

sayIt

これはラップトップでは「hello world」を返しますが、デスクトップでは次のように返します。

run.sh: 3: 関数が見つかりません hello world run.sh: 5: 構文エラー: "}" 予期しない

4

5 に答える 5

147

デスクトップ上で実際に実行しているのではbashなく、キーワードdashを認識しない他の POSIX 準拠のシェルで実行している可能性があります。functionキーワードは、functionbash 拡張機能である bashism です。POSIX 構文では括弧を使用せず、使用functionを義務付けています。

$ more a.sh
#!/bin/sh

function sayIt {   
   echo "hello world"
}

sayIt
$ bash a.sh
hello world
$ dash a.sh
a.sh: 3: function: not found
hello world
a.sh: 5: Syntax error: "}" unexpected

POSIX 構文は、次の両方で機能します。

$ more b.sh
#!/bin/sh

sayIt () {   
   echo "hello world"
}

sayIt
$ bash b.sh
hello world
$ dash b.sh
hello world
于 2012-09-18T00:59:44.407 に答える
7

ls -la /bin/sh

bashまたはdashを指すシンボリックリンクを確認してください

于 2019-03-14T18:54:36.423 に答える
-1

私の場合、bash プロファイルを編集しただけで、端末セッションを再起動するのを忘れていました。

于 2021-11-14T02:19:41.503 に答える
-5

関数名の後、または呼び出し時に()が必要ではありませんか?

function sayIt() { ...
}

sayIt()

?:)

うーん、実際、私のマックでは、貼り付けたとおりに機能します。

dtpwmbp:~ pwadas$ cat aa.sh 
#!/bin/bash

function sayIt() {   
   echo "hello world"
}

sayIt

dtpwmbp:~ pwadas$ ./aa.sh 
hello world
dtpwmbp:~ pwadas$ 

bashバージョンを比較してください。AFAIRの古いバージョンには「()」が必要です。

dtpwmbp:~ pwadas$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.
dtpwmbp:~ pwadas$ 

また、両方のシェルで、shoptオプション(man bash)の状態を比較します。おそらく、そのうちの1つで互換性のある構文がオンまたはオフになっていますか?引数なしの「shopt」コマンドは、サポートされているオプションの状態を一覧表示します。

一部のbashスクリプトで使用される「function」キーワードは何ですか?

于 2012-09-18T00:36:21.653 に答える