ID가 101인 모든 사용자를 나열하는 쉘 스크립트를 작성하려고 합니다.
#!/bin/bash
who="$(who | cut -d ' ' -f 1 | sort -u )";
#Save the output of who
for user in ${who}; do # Iterate over $@
if [ $(echo id -g $user) == "101" ] ; then
echo "Got it";
fi
done;
스크립트를 실행하면 "라인 4: [:인수가 너무 많습니다."라는 오류가 발생합니다. 내가 어디서 실수를 했는지 잘 모르겠습니다.
답변1
그냥 시청해 보는 것이 어떨까요 /etc/group
?
awk -F: '$3==101 { print $4 }'
getent
콘솔에서 사용할 수 있는 경우 다음을 수행하여 목록을 가져와서 /etc/passwd
씹을 수 있습니다.
awf -F: '{print $1}' <(getent group 101)
답변2
오류는 $( echo id -g $user )
단어로 확장된다는 사실 에서 발생합니다 id -g username
. 101
확장이 인용되지 않았기 때문에 비교할 수 없습니다.
id -g "$user"
출력을 비교하려면(큰따옴표 참고) 다음을 사용하십시오.
if [ "$( id -g "$user" )" = "101" ]
문자열 비교 에는 [ ... ]
단일 항목을 사용해야 합니다 =
. 일부 쉘에서는 다음을 [[ ... ]]
사용할 수 있습니다 ==
.
if [[ $( id -g "$user" ) == "101" ]]
여기서는 명령어 치환을 인용할 필요가 없으나 [ ... ]
.
이러한 작업을 수행하는 관용적인 방법은 파이프의 출력을 who
변수에 저장하는 것이 아니라 이를 루프에 직접 전달하는 것입니다.
who | awk '{ print $1 }' | sort -u |
while read user; do
if [ "$( id -g "$user" )" = "101" ]; then
echo 'Got it'
fi
done
답변3
나는 줄을 다음과 같이 변경한다고 생각합니다.
if [ $(id -g $user) == "101" ]; then
문제를 해결할 것입니다. 원래 명령의 출력에는 echo
불필요하다고 생각되는 것이 하나 있습니다.
답변4
getent
비밀번호 데이터베이스를 쿼리 하려면 다음 을 수행하세요.
getent passwd 101