$@ 변수가 for 루프에서 작동하지 않습니다. 사용자 목록을 반복해 보세요.

$@ 변수가 for 루프에서 작동하지 않습니다. 사용자 목록을 반복해 보세요.

질문:

$@for 루프에서 원하는 작업을 수행하기 위한 변수를 가져올 수 없습니다 . 루프는 루프를 돌 때 파일에 이름만 보내고 모든 매개변수를 반복하여 USERS.txt파일에 개별적으로 써야 합니다.

파일은 다음과 같습니다.

something78
something79
something7
dagny
oli
bjarni
toti
stefan_hlynur
jessie

테스트 코드는 다음과 같습니다.

#!/bin/bash

prepare_USERS()
{
    /usr/bin/awk -F: '$3 >= 1000 { print $1 }' /etc/passwd > USERS.txt
    /bin/chmod 777 USERS.txt
    echo "$@"
    for user in "$@"
    do
        echo $user
        echo "$user" >> USERS.txt || echo "writing to USERS.txt failed"; exit 127
    done
}

prepare_USERS "$@"

#for user in "$@"
#do
#    echo "$user" >> USERS.txt
#done

for user in USERS.txt
do
    printf "%s" $user
done

내가 전달한 인수는 다음과 같습니다.

./somethingDELETEme.sh jessie henry allison jason

현재 출력:

$./somethingDELETEme.sh jessie henry allison jason
jessie henry allison jason
jessie

예상 출력:

이 루프는 매개변수 목록의 모든 이름을 반복하여 파일에 씁니다 USERS.txt.

질문:

이전에 이 변수( )를 사용해 본 적이 있지만 $@이런 문제는 발생하지 않았습니다.

루프가 $@매개변수 목록( )의 모든 이름을 반복하지 않는 이유는 무엇이며 올바르게 코딩하는 방법은 무엇입니까?

실제 코드는 다음과 같습니다.

prepare_USERS()
{
    checkIfUser
    /usr/bin/awk -F: '$3 >= 1000 { print $1 }' /etc/passwd > "$CURRENTDIR"/USERS.txt

    /bin/chmod 777 "CURRENTDIR"/USERS.txt
    for user in "$@"
    do
        echo "$user" >> "CURRENTDIR"/USERS.txt || echo "writing to USERS.txt failed"; exit 127
    done
}

답변1

문제는 exit 127for 루프가 잘못 사용되어 첫 번째 for 루프 반복 후에 종료된다는 것입니다. 이를 방지하려면 echo명령문을 그룹화하고 exit복합 블록으로 묶어야 합니다 .{..}

echo "$user" >> USERS.txt || { echo "writing to USERS.txt failed"; exit 127; }

||그러한 그룹화가 없으면 정의가 적용 됩니다.오직명령 echo언제나exit;명령 구분 기호를 정의했기 때문에 파일에 대한 리디렉션의 성공 또는 실패 여부에 관계없이 명령이 실행됩니다 .

이제 복합 그룹화가 활성화되면 내부의 전체 작업 집합이 {..}하나의 블록으로 처리되고, 쓰기 작업이 USERS.txt실패하면 두 작업이 모두 실행됩니다.

관련 정보