コマンドを[]/[[]]で囲まないでください)

コマンドを[]/[[]]で囲まないでください)

ただシェルを学び、vscodeとシェルチェックを使ってsystaxをチェックします。私がやっていることの例は次のとおりです。特定のテキストファイルに文字列があるかどうかを確認したいと思います。

#!/usr/bin/bash
Echo "Enter user"
if [ $grep -q binhqq "text.txt"] ; then
  echo "Found"
fi

ところでなぜこんな警告が表示されるのか警告してくれましたね。Don't wrap commands in []/[[]])本当にありがとうございます。

答え1

スクリプトにはいくつかの基本的な問題があります。

  • Echo代わりに使用echo

  • $grep代わりに使用してくださいgrep$変数を逆参照するためにここでは必要ありません。

  • ユーザーに話しますが、Enter user実際に入力内容を読みません。

シェルチェック警告:

SC1072: Expected test to end here (don't wrap commands in []/[[]]). Fix any mentioned problems and try again.

grep -q binhqq "text.txt"内部が有効なEXPRではなくtest(参照help test)、次を使用して変更できるために発生します。コマンドの置き換え:

if [ -n "$(grep binhqq text.txt)" ] ; then

(出力がgrep空でないことをテスト)または[完全に取り外します]

if grep -q binhqq "text.txt" ; then

(終了状態によって異なりますgrep

答え2

構文に注意してくださいif(bashには非常に便利な対話型helpシステムがあります)

$ help if
if: if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
    Execute commands based on conditional.

    The `if COMMANDS' list is executed.  If its exit status is zero, then the ...

キーワードを見た後、bashはコマンドを見ることを期待しています。特別なことはありませんif。組み込みのコマンドやキーワードだけです。これには任意のコマンドリスト/パイプラインを配置できます。[[[((

魔法はif枝が次に基づいているということです。終了ステータスコマンド数:終了状態が次の場合若い次に、「実際の」ブランチを選択します。0以外終了状態のために「false」分岐が発生します。

答え3

[コマンドtest(または同じ機能を持つ組み込みコマンド)のエイリアスです。

したがって、これを実行するときにコマンドを呼び出して[ grep …渡します。それから「あなたが言ったことを理解できません。」と言ってください。test grep ….testgrep …testgrep …

関連情報