![コマンドを[]/[[]]で囲まないでください)](https://linux33.com/image/194931/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%5B%5D%2F%5B%5B%5D%5D%E3%81%A7%E5%9B%B2%E3%81%BE%E3%81%AA%E3%81%84%E3%81%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%EF%BC%89.png)
ただシェルを学び、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 ….
test
grep …
test
grep …