질문:
$@
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 127
for 루프가 잘못 사용되어 첫 번째 for 루프 반복 후에 종료된다는 것입니다. 이를 방지하려면 echo
명령문을 그룹화하고 exit
복합 블록으로 묶어야 합니다 .{..}
echo "$user" >> USERS.txt || { echo "writing to USERS.txt failed"; exit 127; }
||
그러한 그룹화가 없으면 정의가 적용 됩니다.오직명령 echo
및언제나exit
;
명령 구분 기호를 정의했기 때문에 파일에 대한 리디렉션의 성공 또는 실패 여부에 관계없이 명령이 실행됩니다 .
이제 복합 그룹화가 활성화되면 내부의 전체 작업 집합이 {..}
하나의 블록으로 처리되고, 쓰기 작업이 USERS.txt
실패하면 두 작업이 모두 실행됩니다.