我正在尝试创建一个简单的 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