하위 문자열을 확인하지 않고 첫 번째 항목과 마지막 항목을 포함하여 목록에 bash/unix의 항목이 포함되어 있는지 확인하려고 합니다.

하위 문자열을 확인하지 않고 첫 번째 항목과 마지막 항목을 포함하여 목록에 bash/unix의 항목이 포함되어 있는지 확인하려고 합니다.

여기에 글을 올리는 것은 이번이 처음이므로, 잘못된 점이 있으면 어떤 피드백이라도 환영합니다! 저는 쉘 스크립팅을 처음 접했고 항목이 목록에 있는지 확인하는 함수를 작성하려고 합니다. 이 예에서는 주어진 매개변수가 시스템의 기존 사용자에 해당하는지 확인합니다. 항목이 공백으로 둘러싸여 있는지 확인하여 잘못된 긍정을 피하고 싶지만 이렇게 하면 분명히 목록의 첫 번째 항목과 마지막 항목이 제외됩니다. 목록의 시작과 끝 부분에 공백을 추가할 수 있을 거라 생각했는데 어떻게 해야 할지 모르겠습니다. 어떤 팁이나 조언이라도 환영합니다! 지금까지 내 코드는이 게시물. 다음과 같습니다.

-->기존 사용자 목록입니다.

users=$(getent passwd {1000..60000} | awk -F ':' '{print $1}')

-->지정된 명령줄 인수가 기존 사용자에 있는지 확인하는 함수

contains(){
   [[ $1 =~ (^|[[:space:]])"$2"($|[[:space:]]) ]] && return 0 || return 1
}

여기서 $1은 getent(위 참조)를 사용하여 passwd 파일에서 얻은 사용자 목록이고 $2는 유효성을 검사하려는 지정된(명령줄) 매개변수입니다.

메시지 내용은 다음과 같습니다. 테스트 목적으로 list(1 2 3 4) 포함 기능을 사용하려고 했습니다. 2와 3에 대해 확인하면 방법이 작동하지만 1과 4에 대해서는 작동하지 않습니다.

답변1

아래의 맞춤 기능을 사용해 보세요. 각 항목이 별도의 줄에 있는 목록을 허용합니다. 사용법을 참조하세요.

contains(){ printf "%s\n" "$1"|grep '^'"$2"'$' > /dev/null; }

반환 코드는 grep 명령의 코드입니다.

  • 0 - 항목이 목록에 있는 경우(모든 행과 일치, 대소문자 구분)
  • 1 - 항목이 목록에 없는 경우
  • 2 이상 - 오류가 발생한 경우(오류 메시지가 인쇄됩니다)

원하는 방식으로 작동하려면 위 함수를 수정해야 할 수도 있습니다.

  • 아무것도 인쇄하지 않으며 가능한 오류 메시지도 인쇄하지 않습니다.&> /dev/null
  • 모두 인쇄(목록에 해당 항목이 있는 경우 오류 메시지가 표시될 수 있음): 제거> /dev/null
  • 가능한 오류 메시지를 인쇄하지 않고 항목이 목록에 있는 경우에만 인쇄합니다.2> /dev/null
  • 함수가 0 또는 1만 반환하도록 강제합니다.&& return 0 || return 1;

용법:

list="$(getent passwd {1000..60000}|cut -f1 -d:)"
item="USER_NAME_HERE"
#or
list="$(printf "%s\n" {1..4})"
item="1"
#then
contains "$list" "$item"
#to see the return code
echo $?

답변2

users="$(getent passwd | awk -F: '{print $1}')"

contains(){
   grep -qFx "$2" <<< "$1"
}

다음과 같이 테스트해 보세요.

if contains "$users" "jim"; then
  echo jim is a user
else
  echo jim is not a user
fi

관련 정보