2015-11-03 193 views
0

我對Linux/CentOS和shell腳本相當陌生。假設我有一個名爲useraccounts.list的文件。該文件包含在這個特定的順序CSV數據:與shell腳本混淆從文件中讀取CSV數據

first name, middle initial, last name, username, password 

例如:

John,N,Snow,seords,cuai2Ohzdh 

我試圖做橫向通過這個列表創建從提供的數據的用戶帳戶,密碼在每行的末尾。我想用每個用戶的passwd命令來存儲它。

這是我到目前爲止有:

#!/bin/sh 
for i in 'more useraccounts.list' 
do 
     echo "$1 $2 $3 $4 $5 $6" 
done <file.txt 

是否有人可以幫助我嗎?

回答

2

在開始如何存儲密碼之前,您需要理清如何正確讀取文件中的值。在bash中,確定外殼如何將行分成單個標記的主要工具是Internal Field Separator(默認值:space tab newline)。該過程被稱爲分詞IFS變量允許您設置將控制分詞的字符。

通過在IFS中包含comma,您可以在讀取諸如您的文字的行中使用它。這將允許您指定單個變量來讀取每個nameinitial,last,user namepassword。 A while循環是完成此操作的常規方法 - 它允許您爲該代碼塊設置IFS而不影響腳本的其餘部分。

一個例子,在你的情況,應該是:

#!/bin/bash 

[ -z "$1" ] && { ## validate one argument given on command line 
    printf "error: insufficient input. usage: %s filename.\n" "${0##*/}" 
    exit 1 
} 

[ -r "$1" ] || { ## validate it is a readable filename 
    printf "error: file not found/readable '%s'.\n" "$1" 
    exit 1 
} 

## read each line in file separated by ',' 
# set Internal Field Separator to break on ',' and '\n' 
# protect against lack of '\n' on last line with $pw test 
while IFS=$',\n' read -r first mi last uname pw || [ -n "$pw" ]; do 

    printf "name: %-5s %s. %-6s user: %s pass: %s\n" \ 
     "$first" "$mi" "$last" "$uname" "$pw" 

    ## Create User Accounts/Store Password Here... 

done <"$1" 

exit 0 

輸入

$ cat dat/useracct.txt 
John,N,Snow,seords,cuai2Ohzdh 
Jill,O,Rain,reords,cuai3Ohzdh 
Jane,P,Sleet,peords,cuai4Ohzdh 

輸出

$ bash readuserfile.sh dat/useracct.txt 
name: John N. Snow user: seords pass: cuai2Ohzdh 
name: Jill O. Rain user: reords pass: cuai3Ohzdh 
name: Jane P. Sleet user: peords pass: cuai4Ohzdh 

然後,您可以創建用戶帳戶與所需的選項並以任何你喜歡的方式存儲密碼。如果您有任何問題,請告訴我。

+0

應該「 [-n「$ pw」]'使用'&&'? –

+0

不,在處理非POSIX行結束的文件時,read會將行讀入各個變量,但由於缺少終止換行符,將不會註冊讀取完成。在這種情況下,您需要檢查最後一個變量是否已經填充以代替換行符,以確認讀取的正確性。它的工作原理是因爲列表變量在每次讀取之間都沒有設置,所以如果最後一個變量未被填充,那麼不管終止換行符如何,都沒有完整的讀取。所以在閱讀這裏之後,它是一個/或者測試。 –

+0

謝謝大衛的輸入!我現在有一個關於添加密碼的問題,我實現了添加用戶「useradd -c」$ first $ mi $ last「$ uname」的命令,但現在我想實現passwd,我知道何時使用命令輸入密碼,然後驗證它。有沒有其他的選擇?我可以使用命令passwd ans提供useracct.txt的密碼嗎?謝謝,希望這是有道理的。 – johndoe11710