Bashスクリプトのエスケープパラメータ?

Bashスクリプトのエスケープパラメータ?

渡された引数の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.)

関連情報