このスクリプトの一部として、指定された最初の引数がファイルの最初のワードと一致するかどうかを確認できるようにする必要があります。存在する場合は、エラーメッセージで終了します。そうでない場合は、引数をファイルに追加します。 if
ステートメントの記述方法は理解していますが、grep
をスクリプト内で使用する方法はわかりません。 grep
が次のようになることを理解しています
grep ^$1 schemas.txt
これは私が作るよりずっと簡単なはずだと感じています。
if
ステートメントで「引数が多すぎます」というエラーが発生します。 grep -q
の間のスペースを取り除いた後、予期されるエラー2項演算子を取得しました。
if [ grep -q ^$1 schemas.txt ]
then
echo "Schema already exists. Please try again"
exit 1
else
echo "$@" >> schemas.txt
fi
grep
は、何かが見つかった場合(ゼロ)と何も見つからなかった場合(ゼロ以外)に異なる終了コードを返します。 if
ステートメントでは、ゼロの終了コードは「true」にマップされ、ゼロ以外の終了コードはfalseにマップされます。さらに、grepには-q
引数があり、一致したテキストを出力しません(ただし、終了ステータスコードのみを返します)。
したがって、次のようにgrepを使用できます。
if grep -q PATTERN file.txt; then
echo found
else
echo not found
fi
簡単に言うと、if [ -z "$var" ]…
のようなことをすると、[
は実際にはgrepのように実行中のコマンドであることがわかります。私のシステムでは/usr/bin/[
です。 (まあ、技術的には、シェルにはおそらくそれが組み込まれていますが、それは最適化です。コマンドのように動作します)。同じように機能し、[
は、trueの場合はゼロの終了コードを返し、falseの場合はゼロ以外の終了コードを返します。 (test
は[
と同じですが、最後の]
を除きます)
もう1つの簡単な方法は、grep -c
。
これは、パターンに一致する行数を出力します(終了コードとして返されません)。したがって、一致がない場合は0、一致する場合は1以上です。
したがって、パターンが3回以上一致することを確認する場合は、次のようにします。
if [ "$(grep -c "^$1" schemas.txt)" -ge 3 ]; then
...
私はこれに遅れていることを知っていますが、この短いバージョンが大好きです:
grep -q ^$1 schemas.txt && echo "Schema already exists. Please try again" || echo "$@" >> schemas.txt
[]の代わりに()を試してください。大括弧を使用しなくても、コードは機能します。
ファイルの最初の単語をキャッチしたい場合は、-zw
をgrepに追加する必要があります
if grep -qzw "^$1" file
then
...
else
...
fi
-z
がないと、行の最初の単語が取得されます。 -w
がないと、部分的な単語になります。