While 循环文件返回未找到命令

While 循环文件返回未找到命令

我正在尝试创建一个简单的 shell 脚本来逐行循环文件并以每行作为变量执行命令。

这是我的文本文件:

FakeAccount
FakeUser 

这是我的 shell 脚本:

#!/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 假用户

该命令工作得很好,那么为什么 shell 脚本不执行该命令并且未找到其所说的命令?

答案1

通过将命令及其参数括在双引号中,您将整个字符串显示为单个命令,正如 shell 告诉您的那样,该命令未找到。

shell 需要执行分词,以便查找命令列表、分配、命令及其参数(请参阅 的开头部分以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

相关内容