使用文本文件作为输入?我做错了什么?

时间:2016-03-21 11:27:04

标签: linux shell unix scripting

您好我正在尝试从文本文件中创建多个用户

下面:

tony romo
drew brees
laura smith
bob jones
joe hones
kelly clarkson
hank hill
michael scott

并且为此我使用脚本

while read first last; do
        name="$first $last"
        username="$last${first:0:1}"
        n=‘egrep –c $username /etc/passwd‘
        n=$((n + 1))
        username=$username$n
        password=‘tr –cd '[:alpha:]' < /dev/urandom | head –c8‘
        echo $password | passwd --stdin $username
        echo “$username $password” >> /root/tempPasswords
        useradd –c “$name” –m $username
done
然后我执行命令

./name_of_script accounts.txt

然而没有任何反应,任何想法为什么?谢谢你的帮助!

修改

我做了以下更改,现在我得到了useradd命令错误,任何想法为什么? 我做了更改,但现在有任何原因导致useradd命令出错?

#!/bin/bash
while read first last; do
        name="$first $last"
        username="$last${first:0:1}"
        n=`egrep –c $username /etc/passwd`
        n=$((n + 1))
        username=$username$n
        password=`tr –cd `[:alpha:]` < /dev/urandom | head –c8`
        echo $password | passwd --stdin $username
        echo “$username $password” >> /root/tempPasswords
        useradd –c "$name" –m $username
done < "$1"

2 个答案:

答案 0 :(得分:1)

您编写的脚本从stdin读取。什么都没发生,因为它等着你输入名字。您可以使用重定向运行脚本:

./name_of_script < accounts.txt

或者更改脚本以在其命令行$1上从文件中读取。为此,请将重定向添加到循环中,如下所示:

while read first last; do
    ...
done < "$1"

你也想摆脱聪明的报价。 应为`(反引号),“...”应为"..."(纯双引号)。避免在像MS Word这样的奇特文字处理器中编辑代码。您希望坚持使用像Vim或Notepad ++这样的纯文本编辑器,这些编辑器旨在编辑代码而不是文档。

答案 1 :(得分:1)

你的报价被软管了。如果你有一个卷曲的引用,你应该有一个反引号(ASCII 96),然而在这个千禧年,用现代语法$(command)更好地写。

完成此操作后,只需在< "$1"之后添加done即可读取第一个参数作为while read循环的输入。