Bashスクリプトの問題:「宣言:見つかりません」


23

スクリプトは正常に実行されていましたが、今日実行すると、 declare: not foundます。私はbashシェルを使用しており、スクリプトの開始時にパスが正しいです。

スクリプト内の2つのフラグ付き行は次のとおりです。

declare -a RESPONSE
RESPONSE=($RESULT)

それはまた(予想外であると言うが、私はそれが最初のエラーのために来ていると思う。言及する価値があるのは、declareを直接入力するとうまくいくことです。

declare | grep USER ショー

USER=ashfame
USERNAME=ashfame
           values="$SVN_BASH_USERNAME";

だから、ここで何が間違っているのですか?

回答:


27

sh代わりに使用していますbashか?sh(にリンクdash)はdeclareキーワードも構文もサポートしていません

VAR=(list) 

配列を初期化するため。


私のシバンラインは#!/bin/bash唯一です。どうやってそれを実行するのですか?私はちょうどそれを実行しよう./script.shとしましたが、うまくいきました。しかし、それはscript.shまたはとしては機能せずsh script.sh、1週間前に作成したときに、後者の2つの方法のみを使用していたと確信しています。何がそれを説明できますか?
アシュフェイム

@Ashfame:たぶん1週間前には、現在のbashに固有の機能が欠けていたので、sh script.shでも動作しました
enzotib

いいえ、私はまさにこのスクリプトが1週間または2週間前に機能していたことを意味していました。それとも、何らかの更新が変更を加えた可能性がありますか?
アシュフェイム

@Ashfame:わかりませんが、このスクリプトは、今お見せしたように、sh script.shでは動作しません。
-enzotib

11

あなたの "shebang"行(ファイルのオプションの最初の行)がのsh代わりに参照していると思われますbash。そのはず

#!/bin/bash

bashスクリプト用。スクリプトの最初の行が

#!/bin/sh

それは、厳密にボーン互換のシェルが使用されることを示します。Ubuntuの場合は、dash使用されます。他の多くのディストリビューションでは、これらがリンク/bin/shしているため、問題は発生しません/bin/bash。ただし/bin/dash、システムスクリプトをより迅速に実行できるようにするために、ubuntuはリンクします。

declare組み込みは次のいずれかであるbashBourneシェルスクリプト仕様への多くの拡張。dash拡張なしでその仕様を実装するだけです。


私の#!/bin/bash
シバンライン

@Ashfame:スクリプトをどのように実行していますか?スクリプトの名前を入力するだけでスクリプトを呼び出す場合、shebang行により、実行するインタープリターが決まります。ただし、を介して明示的に呼び出すとsh thescript.shshシェル、つまりdash解釈されます。
直観

1
@intuitedを実行していましたsh script.sh。私はあなたが言ったことを理解していますが、私はこの方法でbashそれを解釈するだろうとどこかで読みました。なぜdashここで役割を果たしますか?Ubuntuのみですか?私が読んだのは、一般的なLinuxのことかもしれません。
アシュフェイム

2
@Ashfame sh scriptコマンドを実行しているsh引数を持つscriptSH読み取りを行い、そのファイル内のコマンドを実行し、。シバンはshによって読み取られるのではなく、aで始まる#ため、コメントとして扱われます。代わりにを実行する./scriptと、カーネルはシバンを読み取ります。これはあなたの場合#!/bin/bash、ですから、実行されます/bin/bash ./script
-geirha

私はそれが動作する方法を知っているのthatsけど@intuited言及はい@geirha dash私はそれを明確にする必要があるので、使用されます
Ashfame

3

上記のエラーを再現する方法:

Ubuntu 14.04 64ビットを使用しています。このコードをファイルに入れます:

#!/bin/sh 
declare -i FOOBAR=12; 
echo $FOOBAR; 

次のように実行します。

el@apollo:~$ ./06.sh 
./test.sh: 2: ./test.sh: declare: not found

修正するには、代わりにこれを行います:

#!/bin/bash
declare -i FOOBAR=12;
echo $FOOBAR;

プリント:

el@apollo:~$ ./06.sh 
12

1

私も同じ問題を抱えていましたが、シェルスクリプトを実行するには適切なアクセス許可を割り当てる必要があることを思い出しました。

スクリプトの許可を変更します。例えば:

chmod 755 script.sh

1

/bin/bash代わりにコマンドラインでスクリプトを実行してみてくださいsh(:

の代わりに :

    sh script.sh

試してください:

    / bin / bash script.sh

1

Ubuntuでは、その中に他のスクリプトを実行しているスクリプトがあります。

some_dir/  
        | main.sh  
        | shhh.sh

#!/bin/bash -e

echo "file? $0"
# file? ./main.sh

echo "shell? $SHELL" 
# shell? /bin/bash

# sh shhh.sh
# file? shhh.sh
# shell? /bin/bash
# shhh.sh: 5: shhh.sh: declare: not found

$SHELL shhh.sh
# file? shhh.sh
# shell? /bin/bash
# foo? bar

#!/bin/bash -e

echo "file? $0"
# shhh.sh

echo "shell? $SHELL"
# shell? /bin/bash

declare foo="bar"

echo "foo? $foo"

すべてsh some_script.shを変更して$SHELL some_script.sh修正しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.