シェルスクリプトに失敗しました:構文エラー: '( '予期しない

シェルスクリプトに失敗しました:構文エラー: '( '予期しない

私はラズベリーパイ開発のための開発環境を自動的に設定するスクリプト作業をしてきました(作業の段階的な詳細は次のとおりです)。ここ)。スクリプトはその記事にリンクされていますが、便宜上、ここで見つけることができます。ここ返品。このスクリプトを実行すると、エラーなしで環境をインストールして設定できますが、デフォルトの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

スクリプトは次から始まりません。シェルボーンわかりましたので、システムはそれを実行するために使用します/bin/sh。 Ubuntuでは/bin/shそうですスプリント、標準機能のみを備えたクイックスタートおよび実行用に設計されたシェルです。ダッシュが68行に達すると、構文エラーが表示されます。つまり、文脈上の括弧は意味がありません。

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

shebang行はファイルの最初の行でなければなりません。 bash機能を使用しているため、ファイルの最初の行はまたはで#!/bin/bashなければなりません#!/usr/bin/env bash

答え2

私にとって、起動スクリプトは次のとおりです。

bash ./< script file > 

うまくいきます。

答え3

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

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

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

スクリプトを解釈するための2つのオプションがありますbash

  1. shebangを最初の行に移動

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

     sudo bash ./pi_dev_env_install.sh
    

答え4

スクリプトファイルでdos2unixを試してください。時々、ソースコードに隠された文字があるかもしれません。

注文する:

dos2unix script_file.sh script_file.sh

関連情報