options
次の単純化されたコードを使用して、配列内のエントリがファイルに存在するかどうかを確認します。$file
options=(
A
B
C
)
for i in "${options[@]}"; do
if grep -F $file "${i}" = false; then
echo "${i}"
fi
done
私はこれがA、B、またはC(存在しない場合)を出力すると予想しましたが、$file
A、B、およびCを出力します。
grep: A: No such file or directory
grep: =: No such file or directory
grep: false: No such file or directory
これにより、grepはすべての引数を検証または確認するファイルとして解釈するように見えます。これは、if文にブール値の正しい構文がないことを意味します。だから私の質問は2つです。
- grepまたは他のコマンドを使用して配列の要素が存在することを確認するにはどうすればよいですか
$file
? - このコマンドがブール値をifステートメントの一部として保持するのではなく、パラメータとして解釈しないようにするにはどうすればよいですか?
ベストアンサー1
- を含むすべての変数拡張を引用します
$file
。 - 「ブール」を確認しないでください。殻にはそんなことはありません。意味するのは、grepの終了コードを確認することです。一致する行がない場合は1、行が一致する場合は0です(で見つかります
man grep
)。 - grepパラメータの順序を確認してください。まずモード、次のファイル名です。
options
これにより、ファイルにない配列のすべての要素がエコーされます。
options=(
A
B
C
)
for i in "${options[@]}"; do
if ! grep -qF "$i" "$file"; then
echo "$i"
fi
done
-q
標準出力に送信されるgrepと一致する行を抑制するフラグをgrepに追加しました。