私はそれを使用しています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