루프 파일이 찾을 수 없는 명령을 반환하는 동안

루프 파일이 찾을 수 없는 명령을 반환하는 동안

파일을 한 줄씩 반복하고 각 줄을 변수로 사용하여 명령을 실행하는 간단한 셸 스크립트를 만들려고 합니다.

이것은 내 텍스트 파일입니다.

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

관련 정보