참고: 각 파일에 한 줄씩 1개의 단어가 포함되어 있으면 이는 간단합니다.
소스 파일에서 공백을 사용하려는 경우 다른 구분 기호를 사용할 수 있습니다.
while IFS=@ read -r aws_user_name aws_key aws_account_num ;do
printf "User: %-16s Key: %-22s AccNum: %s\n" \
"$aws_user_name" "$aws_key" "$aws_account_num"
# ....
done < <(
paste -d@ "$aws_users_all" "$aws_env_list" "$aws_account_numbers"
)
IFS=@
paste -d@
그게 무슨 뜻인지 잘 모르겠어요 ? 나는 그것을 이해 paste -d "|,"
하고 IFS=";"가 무엇을 의미하는지 알아낼 수도 있습니다. 나도 팔로우한다https://stackoverflow.com/questions/7427262/how-to-read-a-file-into-a-variable-in-shell
https://man7.org/linux/man-pages/man1/bash.1.html
답변1
FWIW, 답변보다 의견에 더 가깝습니다.@roaima 제공), 다음과 같이 작성하는 것이 더 합리적입니다.
while
IFS= read -r aws_user_name <&3 &&
IFS= read -r aws_key <&4 &&
IFS= read -r aws_account_num <&5
do
printf "User: %-16s Key: %-22s AccNum: %s\n" \
"$aws_user_name" "$aws_key" "$aws_account_num"
# ....
done 3< "$aws_users_all" 4< "$aws_env_list" 5< "$aws_account_numbers"
@
나중에 가입하고 분할하는 대신 @
.
이 방법으로 @
in 값을 갖는 것은 문제를 일으키지 않으며 3개 목록의 누락된 요소가 올바르게 감지됩니다. 또한 <(...)
kshism을 방지하여 표준 코드로 만듭니다 sh
.
awk
루프가 수행하는 작업이 전부 인쇄라면, perl
이와 같은 루프에서 일부 투박한 도구를 여러 번 호출하는 것보다 적절한 텍스트 처리 유틸리티를 사용하는 것이 더 합리적일 수 있습니다. 자세한 내용은 다음을 방문하세요.쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까?
답변2
이제 이해했으므로 필드를 구분하는 대신 paste -d "|,"
의미를 추론할 수도 있습니다 . paste -d@
이는 동일한 프로세스입니다 . (많은 UNIX/Linux 도구와 마찬가지로 플래그와 해당 인수는 공백으로 연결되거나 구분될 수 있습니다. 표준 구문 분석 라이브러리는 상관하지 않습니다.|,
@
POSIX 유틸리티 인수 구문, 포인트 2a. )
이 경우 IFS
변수는 동사가 입력을 구문 분석하는 방법을 결정합니다 read
. 변수 aws_user_name
, aws_key
및 는 aws_account_num
출력에서 읽혀지고 paste -d@
방금 추가된 기호에서 분할됩니다.@
paste
명령을 부분적으로 분석하여 무슨 일이 일어나고 있는지 확인할 수 있습니다. paste
명령을 실행하면(세 변수에 대한 적절한 파일 이름 사용) while read …
루프가 처리할 내용이 표시됩니다.
paste -d@ "$aws_users_all" "$aws_env_list" "$aws_account_numbers"
@
소스 값에 구분 기호( )가 포함되어 있으면 이 처리가 중단됩니다 .