Bash 스크립트의 이스케이프 매개변수?

Bash 스크립트의 이스케이프 매개변수?

전달된 인수 중 하나가 유효한 그룹인지 확인하려는 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.)

관련 정보