![루프 파일이 찾을 수 없는 명령을 반환하는 동안](https://linux55.com/image/12187/%EB%A3%A8%ED%94%84%20%ED%8C%8C%EC%9D%BC%EC%9D%B4%20%EC%B0%BE%EC%9D%84%20%EC%88%98%20%EC%97%86%EB%8A%94%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EB%B0%98%ED%99%98%ED%95%98%EB%8A%94%20%EB%8F%99%EC%95%88.png)
파일을 한 줄씩 반복하고 각 줄을 변수로 사용하여 명령을 실행하는 간단한 셸 스크립트를 만들려고 합니다.
이것은 내 텍스트 파일입니다.
FakeAccount
FakeUser
이것은 내 쉘 스크립트입니다.
#!/bin/bash
while IFS= read -r line; do
"echo -e 'testpassword\ntestpassword' | passwd $line"
done < "User.txt"
내가 얻은 출력은 내가 원하는 것 같습니다. 출력은 다음과 같습니다.
"라인 4: echo -e 'testpasswd\ntestpasswd' | passwd FakeAccount: 명령을 찾을 수 없습니다."
"라인 4: echo -e 'testpasswd\ntestpasswd' | passwd FakeUser: 명령을 찾을 수 없습니다."
하지만 다음 문자열을 정확하게 복사하면 echo -e 'testpasswd\ntestpasswd' | passwd fake user
명령은 잘 작동하는데 왜 쉘 스크립트가 명령을 실행하고 그 내용을 찾지 못하는 걸까요?
답변1
명령과 해당 인수를 큰따옴표로 묶으면 전체 문자열이 단일 명령으로 표시되며, 쉘에서 알 수 있듯이 찾을 수 없습니다.
쉘은 명령 목록, 할당, 명령 및 해당 인수를 찾기 위해 토큰화를 수행해야 합니다( man bash
자세한 내용은 시작 부분 참조).
전체 파이프에 큰따옴표를 사용하지 말고 변수만 인용하십시오.
echo -e 'testpassword\ntestpassword' | passwd "$line"
답변2
다음을 사용하면 더 간단하게 이 작업을 수행할 수 있습니다 chpasswd
.
while read -r user; do printf "$user:%s" "some_secret_pass" | chpasswd ; done < User.txt
또는 를 사용하려면 해당 플래그를 passwd
전달해야 할 수도 있습니다 . --stdin
내가 아는 한, 최근 Fedora와 Centos 버전은 이것을 지원합니다.
사용 passwd
:
while read -r user; do printf %s\\n "some_secret_pass" | passwd --stdin "$user" ; done < User.txt