유닉스의 for 루프와 에코

유닉스의 for 루프와 에코

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

관련 정보