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