単純なBashスクリプトでは、「予期しないトークン '$#''付近の構文エラー」が発生します。

単純なBashスクリプトでは、「予期しないトークン '$#''付近の構文エラー」が発生します。

私はそれを使用していますDebian 10(Buster) 単純な Bash スクリプトでエラーが発生しました。それがすることは、引数が渡されたことを確認するだけです。ファイルの場合は、そのファイルをエコーできます。

#!/usr/bin/bash
if [ ( '$#' -eq 1 ) && ( -f "$1" ) ]; then
        echo "$1"
fi

exit 1

次のエラーが発生します。

line 2: syntax error near unexpected token `'$#''
line 2: `if [ ( '$#' -eq 1 ) && ( -f "$1" ) ]; then'

私は周りの引用符("、'、引用符なし)のすべての組み合わせを試しましたが、$#常に私が使用している引用符の種類に応じて、これらのエラーメッセージのバリエーションが表示されます。何を探しているのかわかりません。

答え1

これには2つの問題があります。まず、単純な[組み込み関数を含めることはできません&&。複数の条件を組み合わせるには、次のうち1つ以上が必要です[

if [ "$#" -eq 1 ] && [ -f "$1" ]; then

$#第二に、拡張する必要があるため、一重引用符は使用できません。あなたのバージョンは'$#' -eq 1次のように動作します。ひも $#1位へ。

bashキーワードを使用すると、すべてがはるかに簡単になります[[

if [[  "$#" -eq 1  &&  -f "$1"  ]]; then

答え2

[コマンドなので、実際に問題は複数の条件を使用したい方法です。あなたはこれが欲しい:

if [ "$#" -eq 1 ] && [ -f "$1" ]; then

答え3

他の回答ではスクリプトの修正方法について説明しますが、技術的にエラーが何であるかを知りたいです。コマンドの単語を引用解除してエスケープしないようにするbashの唯一の有効な構文は、関数を定義するときだと(思います。それでbashはそれを見て(すぐにそれがという関数の定義であるに違いないと思います。しかし、あなただけを期待するbashに[従うので、構文エラーが発生します。関数定義でなければ、その意味が何であるか誰が知っていますか?それ以降は同じ構文エラーが発生します。'$#')()

$ echo ( foo )
bash: syntax error near unexpected token `foo'

次の内容を削除し(て関数定義の構文に従わない場合は、次のような結果が表示されます。

$ [ ( ) ( -f "$1" )

最後に、関数が定義されます[

$ [
bash: -f: command not found

関連情報