`構文エラー:配列を作成するときの「(" unexpected`」


37

2台の(Debian)Linuxサーバーがあります。シェルスクリプトを作成しています。

最初に、こうして配列を作成します:

#!/bin/bash
target_array=(
    "/home/user/direct/filename -p123 -r"
)

それはうまくいきます。しかし、他のサーバーでこれを実行すると、次のようになります:

Syntax error: "(" unexpected

私の知る限り、両方のサーバーは同じです。なぜこれがうまくいかないのか、誰かが光を当てることができますか?

ターミナルに直接入力すると問題ありませんか?


私がそれを実行すると

sh scriptname.sh

エラーが表示されますが、次のように実行すると

./scriptname.sh

大丈夫そうです。違いは何ですか?


2台のサーバー間でスクリプトをコピーアンドペーストしましたか?試すcat -v <script>スプリアス文字があるかどうかを確認します。
LilloX

2
shされていないbashとして、それを実行しているし、そうすることはsh scriptname.sh間違っている
エリックRenouf

回答:


56

使用./scriptname.shすると/bin/bash、最初の行のようにwithで実行され#!ます。しかし、あなたが使用している場合sh scriptname.sh、それが実行されるsh、ではありませんbash

shシェルは、アレイを作成するには何の構文を持っていませんが、bashは、あなたが使用する構文を持っています。


OK、それは今理にかなっています。おそらくおわかりのように、私はLinuxを初めて使用します(現在、Powershellスクリプトのshell / bashスクリプトを変換しようとしています)。これからも使い続けます./。乾杯
-IGGt

それは必ずしもではありませんが、#!/bin/shand sh script.sh(or #!/bin/bashand bash script.sh)の間の調整が必要です
コンスタンチンモレンコ

3
sh言語には配列(a[index]=xまたはa=(x y))がありません。一部のshインタープリターは配列をサポートしますが、ksh88(Linux AFAIKには移植されません)と一部の古いpdkshバリアントはサポートa[index]=valueしますが、サポートしませんa=(x y)。Debianでは、sh通常、dashこれはアレイをサポートしていません(a[index]=x動作しません)。
ステファンシャゼル

1
これからバラバラに死ぬことができます!:)
パウロ

0

実行./scriptname.shすると、ファイルの最初の行が読み取られ、「/ bin / bash」を実行してスクリプトの残りをインタープリターに渡す必要があることがわかりsh scriptname.shます。実行すると、ファイルがユーザーの標準シェル(Ashなど)に渡されますまた、他のインタープリターがBashのように配列をサポートしていない場合もあります。


1
shは必ずしも「ユーザーの標準シェル」ではなく、多くの場合、独自の実行可能ファイル(またはシンボリックリンク)でありsh、スクリプトを処理するために呼び出されます。そのユーザーのデフォルトのログインシェルがbash
Eric Renouf

それは私が現時点で完全に確信していなかった部分でした。説明をありがとう!
-dave_alcarin

0

sh scriptname.sh、あなたはそれを実行しているsh、必ずしもではありませんbashsh --version両方のマシンで比較してみてください。および/またはdpkg -S $(which sh)


場合でもshへのシンボリックリンクであるbashとして呼び出されたとき、それは異なる動作をしますsh
エリックRenouf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.