2014-04-26 96 views
0

我試圖從文件中將用戶添加到系統中。該文件看起來完全是這樣的:帶循環的多個變量

[email protected] password 1 
[email protected] baddpassword 2 

這些數字是它們的ID。它來自一個MySQL數據庫,我需要對這些變量做些什麼,所以我需要4個變量。 USER,PASS,FIRSTID(是1)和LASTID(在這種情況下是mysql dump的最後一個ID,2.這是考慮一次超過2個入口)

到目前爲止我所擁有的是:

for USER in `cat /root/users_w_pass | sed -n '1!p' | awk [email protected] '{print $1}'` 
do 
    for PASS in `cat /root/users_w_pass | sed -n '1!p' | awk -F ' ' '{print $2}'` 
    do 
     useradd $USER -d /home/$USER -m -s /home/$USER.sh 
     echo "$USER:$PASS" | chpasswd 
    done 
done` 

運行此,密碼不會被添加到相應的用戶,我對我應該如何做到這一點,因爲我認爲這是可行的,但我可以看到它是如何不不知道。另外,我需要做的不僅僅是將它們添加到系統中,而是爲每個文件創建文件併爲其分配ACL,因此在文件上運行newusers將無法​​在此工作,特別是還有第三列。

+0

你不應該在可以直接讀取它的程序中使用'cat',比如'sed'和'awk'。你不需要混合使用'sed'和'awk','awk'可以完成所有工作。你不應該使用舊的backtics,而是用括號代替'$(code)',這樣可以寫出第一行。 '用於$(awk -F @'NR> 1 {print $ 1}'/ root/users_w_pass)'的用戶' – Jotne

+0

瞭解這一點。儘管如此,我仍然遇到了腳本的核心問題。我似乎無法分開for循環中的變量。我沒有讀過'while read',但在我的情況下不確定它的語法。謝謝。 – unixpipe

+0

第二個循環可能是'for pass for $(awk'NR> 1 {print $ 2}'/ root/users_w_pass)' – Jotne

回答

0

只使用bash

while read email password trash; do 
    user=${email%%@*} 
    useradd "$user" -d "/home/$user" -m -s "/home/$user.sh" 
    echo "$user:$password" | chpasswd 
done < your_file.txt 

或(即使我傾向於第一種解決方案):

while read; do 
    set -- "$REPLY" 
    user=${1%%@*} 
    password=$2 
    useradd "$user" -d "/home/$user" -m -s "/home/$user.sh" 
    echo "$user:$password" | chpasswd 
done < your_file.txt 

如果你要過濾的第一線,這裏是一個解決方案:

i=0 
while read email password trash; do 
    if [[ $i -ne 0 ]]; then 
     user=${email%%@*} 
     useradd "$user" -d "/home/$user" -m -s "/home/$user.sh" 
     echo "$user:$password" | chpasswd 
    fi 
    ((i++)) 
done < your_file.txt 

不需要同時使用awksed在這種情況下,從不使用for i in $(command)see this answer

+1

使用參數擴展'user = $ {email %% @ *}'而不是'echo | cut'管道。 – chepner

+0

@chepner非常感謝。我已經更新了我的答案;) –