渡された引数の1つが有効なグループであることを確認したいbashスクリプトを作成しています。
ケーブルがあります。
if [ `grep -c -e '\b$2\b' /etc/group` -eq 0 ]; then
echo "Error: $2 is not a valid group."
else
これは、常に有効なグループが無効であることを知らせます。
私の考えでは警察アウトだと思います。というグループを検索しているようです$2
。エラーメッセージには、渡されたパラメータが正しく表示されます。しかし、$2
バックティック内部を正しく脱出しているかどうかはわかりません。
この行を機能させるにはどうすればよいですか?
答え1
grep
'オプションを使用する方が-q
コマンド置換よりも効率的です。
if ! grep -q -e "^$2:" /etc/group; then
echo "Error: $2 not a valid group" >&2
fi
問題は、一重引用符('
)がシェル変数拡張($
)を妨げるということです。二重引用符()を使用する必要があります"
。
答え2
grep -q -e "^$2:" /etc/group
動作する必要があります。
(一重引用符は補間を防ぎます)
答え3
一重引用符のため文字通り渡しています\b$2\b
。パラメータ値の拡張をgrep
許可するには、を使用します。また、バックティックの間に引用するのは難しいかもしれません。これは(コマンドの置き換え)と同じで、引用に適しています。$2
"$2"
$(…)
`…`
if [ $(grep -c -e "\b$2\b" /etc/group) -eq 0 ]; then …
次に、一致を計算するのは複雑すぎます。grep
戻り状態を使用して、一致があるかどうかを確認できます。-q
オプションを渡すと、grep
出力に興味がなく、戻り状態にのみ興味があることを示します。
if ! grep -q -e "\b$2\b" /etc/group; then …
次に検索が間違っています。という単語を探していますが、$2
ユーザー名、句読点を含むグループ名の一部、またはより珍しい不一致と一致する可能性があります。グループ名はコロンで区切られた最初のフィールドなので、そのフィールドを検索してください。
if ! grep -q -e "^$2:" /etc/group; then …
入力内容を削除する必要があります。特殊文字やグループ区切り文字$2
を含めないでください。grep
case $2 in
*[][\.*^$]*) echo "Unsupported character in the group name";;
esac
if ! grep -q -e "^$2:" /etc/group; then …
最後に、grep /etc/group
避けることができれば、これは正しいツールではありません。この方法では、NISやLDAPのグループや異常な設定ではなく、ローカルグループ名のみを見つけることができます。ほとんどの最新のユニス(少なくともSolaris、Linux、および* BSD)ではgetent
このコマンドは、システムデータベース(グループデータベースを含む)からエントリを取得します。
if ! getent group "$2" >/dev/null; then …
(ユーザーの場合は見ないで、/etc/passwd
を利用getent passwd
したり、より便利に電話をかけてみてください。id
.)