![하위 문자열을 확인하지 않고 첫 번째 항목과 마지막 항목을 포함하여 목록에 bash/unix의 항목이 포함되어 있는지 확인하려고 합니다.](https://linux55.com/image/155235/%ED%95%98%EC%9C%84%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%ED%99%95%EC%9D%B8%ED%95%98%EC%A7%80%20%EC%95%8A%EA%B3%A0%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%ED%95%AD%EB%AA%A9%EA%B3%BC%20%EB%A7%88%EC%A7%80%EB%A7%89%20%ED%95%AD%EB%AA%A9%EC%9D%84%20%ED%8F%AC%ED%95%A8%ED%95%98%EC%97%AC%20%EB%AA%A9%EB%A1%9D%EC%97%90%20bash%2Funix%EC%9D%98%20%ED%95%AD%EB%AA%A9%EC%9D%B4%20%ED%8F%AC%ED%95%A8%EB%90%98%EC%96%B4%20%EC%9E%88%EB%8A%94%EC%A7%80%20%ED%99%95%EC%9D%B8%ED%95%98%EB%A0%A4%EA%B3%A0%20%ED%95%A9%EB%8B%88%EB%8B%A4..png)
여기에 글을 올리는 것은 이번이 처음이므로, 잘못된 점이 있으면 어떤 피드백이라도 환영합니다! 저는 쉘 스크립팅을 처음 접했고 항목이 목록에 있는지 확인하는 함수를 작성하려고 합니다. 이 예에서는 주어진 매개변수가 시스템의 기존 사용자에 해당하는지 확인합니다. 항목이 공백으로 둘러싸여 있는지 확인하여 잘못된 긍정을 피하고 싶지만 이렇게 하면 분명히 목록의 첫 번째 항목과 마지막 항목이 제외됩니다. 목록의 시작과 끝 부분에 공백을 추가할 수 있을 거라 생각했는데 어떻게 해야 할지 모르겠습니다. 어떤 팁이나 조언이라도 환영합니다! 지금까지 내 코드는이 게시물. 다음과 같습니다.
-->기존 사용자 목록입니다.
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