Bashスクリプトエラー:予期しない表示 '( 'の近くに構文エラーがあります。

Bashスクリプトエラー:予期しない表示 '( 'の近くに構文エラーがあります。

コマンドを複数回実行したいが他のパラメータを渡したいので、これを行うために次のシェルスクリプトを作成しました。

#!/bin/bash                                                                                                                                                                                                   
for i in {4..6}
do
    for j in {0..10}
    do
        for k in {0..2}
        do
            root -b -l -q fitInvMass.C+($i,$j,$k)
        done
    done
done

ただし、これにより次のエラーが発生します。

fit.sh: line 8: syntax error near unexpected token `('
fit.sh: line 8: `       root -b -l -q fitInvMass.C+($i,$j,$k)'

答え1

括弧は、関数定義、コマンドとプロセスの置換、配列の割り当て、算術式、サブシェルなど、さまざまな演算子や構造に使用されるシェル構文の特殊文字です。リテラル角かっこが必要な場合は、引用符で囲む必要があります。

root -b -l -q "fitInvMass.C+($i,$j,$k)"

二重引用符を使用すると、文字列の変数が拡張され、fitInvMass.C+($i,$j,$k)括弧はシェルコードとして解釈されません。


一般的な推奨事項はShellCheck(https://www.shellcheck.net)シェルコードをテストします。引用符の欠落などの問題を指摘するのに役立ちます。

ただし、この場合、ShellCheckは3つの変数拡張をfitInvMass.C+($i,$j,$k)引用しなければならないことを正しく示していますが、括弧も引用すべきであることを見つけることができません。これは、次の修正された行を喜んで受け入れることを意味します。

root -b -l -q fitInvMass.C+("$i","$j","$k")

(または変数が引用されているが括弧は引用されていないバリアントです。)

ただし、まだ実行に失敗し、同じ診断エラーメッセージが表示されます。 ShellCheckはなぜ文句を言わないのですか?

+(...)シェルの拡張ワイルドカード構文の有効部分である拡張ワイルドカードパターン。残念ながら、ShellCheckはパターンを有効にするにはシェルオプションを有効にする必要があることをbash無視して、とにかくそれを許可するようです。extglobこれはおそらくShellCheckのバグです。

関連情報