標準入力から文字列を読み取っていますが、その文字列に一致するユーザーを表示したいと思います。問題は、ユーザーが「[」文字またはそれを含む文字列を入力した場合です。
grep -F
行は文字列(^ - -Fを使用した単純な文字)で始まる必要があるため、機能しません。また、getent $user
IDではなくユーザー名のみが必要なため、これはお勧めできません。
if [[ "$user" == *"["* ]]; then
echo -e "Invalid username.\n"
continue
fi
if ! getent passwd | grep "^$user:"; then
echo -e "Invalid username.\n"
continue
fi
これは「[」の回避策です。他の方法はありますか?
awk
そのタスクを実行する可能性が最も高いですが、それについてはまだわからず、grepに興味があります。
ベストアンサー1
エスケープするか、次のように文字クラスに入れます。
grep '\['
grep '[[]'
grep -e "${user//\[/\\\[}"
${var//c/d}
シェル変数の構文=>$var
すべての文字c
をd
。今、あなたの場合、この構文は特別なのでc
(グロービングを実行する)前にバックスラッシュを付けてエスケープする必要があります。つまり、 。[
[
\[
今、交換部品に関して私たちに必要なのは、\[
次のいずれかです。ただし、パラメーターの代替構文では、\
両方が特別です。はい、推測しましたが、両方ともバックスラッシュが必要なので、次の式が生成されます。 [
${var//...}
\\\[
"${var//\[/\\\[}"
ファタイ