シェルスクリプトが失敗する:構文エラー:“(”予期しない


64

Raspberry Pi開発用の開発環境のセットアップを自動化するスクリプトに取り組んでいます(詳細な手順については、こちらをご覧ください)。スクリプトはその記事にリンクされていますが、利便性はこちらからも見つけることができます。これで、このスクリプトを実行すると、エラーなしで環境がインストールおよびセットアップされますが、デフォルトではsudoのタイムアウト値のため、sudoパスワードを複数回入力する必要があります。そこで、すべてのsudo行を削除し、コマンドラインでsudoを使用してスクリプト全体を実行することで、実験を開始しました。

kemra102@ubuntuvm:~$ sudo ./pi_dev_env_install.sh

これは期待どおりに機能し、この時点までほとんどの方法を通過します。

./pi_dev_env_install: 68: ./pi_dev_env_install.sh: Syntax error: "(" unexpected

sudoを使用してスクリプト全体を実行しない場合、以前はこの行が正常に機能していました。sudoとして実行しているこの行については、私の知る限りそれを停止する必要はありません。


1
シバンは本当に9行目ですか?UbuntuのDashAsBinShアフィニティにより、スクリプトはのdash代わりに解釈されると思われますbash。1行目でシバンを動かしてみてください。
manatwork12年

その記事によると、/ bin / shの代わりに/ bin / bashを直接呼び出すと、ダッシュの代わりにbashを正しく使用してください。そうすれば、理解できるように問題になりません。もちろん、シバンを移動することはできますが、スクリプト全体をsudoしない場合になぜ機能するのかは実際には説明されていません。
-kemra102

私の場合、すべてが順調でしたが、習慣として、「bash」ではなく「sh」でシェルスクリプトを実行していました。
インドラジートグル

回答:


82

スクリプトはシェバン行で始まっていないため、システムはそれをで実行し/bin/shます。Ubuntuに/bin/shdashがあります。これは、標準機能のみを備えた高速な起動と実行のために設計されたシェルです。ダッシュが行68に達すると、構文エラーが表示されます。つまり、括弧はコンテキストでは意味を持ちません。

(他のすべてのシェルと同様に)ダッシュはインタープリターなので、実行が問題のある行に達するまで文句を言いません。したがって、テストのある時点でスクリプトが正常に開始されたとしても、68行目に達するとスクリプトは中止されます。

ファイル内の最初の行はシェバン行でなければなりません。あなたはbashの機能を使用するので、ファイルの最初の行がなければなりません#!/bin/bash#!/usr/bin/env bash


2
明らかに私の知識のギャップに感謝します、私はあまりスクリプトを書かないので、そのことに気づきませんでした!説明をありがとう、それは大いに役立ったし、将来も知るのに非常に役立つだろう。
kemra102

nautilusのスクリプト拡張機能を使用している場合でもこのエラーが発生することを付け加えます。シェバン行を追加すると、すぐに解決しました。+1。
バビン道志

sonarqube.shUbuntu 15.10で実行されている問題に直面しています。前述のようにヘッダーを変更しました。実行していsudo sh ./sonar.sh consoleます。まだエラーが発生します。
-soufrk

それ@soufrkですsonarqube.shsonar.sh?決心してください。とにかく、このスレッドの情報で問題を解決できない場合は、スクリプトの完全な内容で新しい質問をし、完全なエラーメッセージをコピーして貼り付けてください。
ジル「SO-悪であるのをやめる」

私の悪い!! 間違ったarch実行可能ファイルを実行していました。しかし、興味深いことに、正しいアーチ上で始まるファイルは#! /bin/sh完全に実行されました。今、それは私を困惑させます。
-soufrk

6

shebangが最初の行にない場合、rootユーザーのシェル、SHELL変数、または-sフラグに関係なく、それは尊重されません。これが簡単な例で簡単に確認できます:

#
#!/bin/bash
offfset=(`ls`)
echo $offset

このスクリプトをsudoで実行すると、UbuntuおよびDebianの最近のバージョンで構文エラーが発生します。

スクリプトが以下によって解釈されることを確認するための2つのオプションがありますbash

  1. シバンを最初の行に移動します

  2. 次のsudoように実行します。

    sudo bash ./pi_dev_env_install.sh

1

スクリプトを開始する私にとって:

bash ./< script file > 

正常に動作します。


それはあなたにも当てはまるかもしれませんが、それは実際に述べられた問題の解決策ではありません。
bu5hman

0

たぶん、ディレクトリ名またはファイル名に「(」があるかもしれません。


0

スクリプトファイルでdos2unixを試してください。ソースに隠されたキャラクターがいる場合があります。

コマンド:

dos2unix script_file.sh script_file.sh

0

これは、目的のインタープリターをオーバーライドした場合に発生する可能性があります。たとえば、これは使用されているハッシュバンに関係なくshで実行されます(ハッシュバンを使用しない場合に便利です)。

> sh run.sh

またはbashを実行するには:

> bash run.sh

スクリプトで定義されたハッシュバング値を使用するには、次を使用します。

> ./run.sh

-1
sudo chmod 755 <script>

私の場合、エラーはファイルを実行するための許可が不足していました。コマンドを分離したときにのみエラーメッセージが表示されます。

$ sudo sh
# ./install

アクセス許可がなくても、このエラーメッセージは表示されません。
ジル 'SO-悪であるのをやめる'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.