在開始如何存儲密碼之前,您需要理清如何正確讀取文件中的值。在bash中,確定外殼如何將行分成單個標記的主要工具是Internal Field Separator
(默認值:space tab newline
)。該過程被稱爲分詞IFS
變量允許您設置將控制分詞的字符。
通過在IFS
中包含comma
,您可以在讀取諸如您的文字的行中使用它。這將允許您指定單個變量來讀取每個name
,initial
,last
,user name
和password
。 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
然後,您可以創建用戶帳戶與所需的選項並以任何你喜歡的方式存儲密碼。如果您有任何問題,請告訴我。
應該「 [-n「$ pw」]'使用'&&'? –
不,在處理非POSIX行結束的文件時,read會將行讀入各個變量,但由於缺少終止換行符,將不會註冊讀取完成。在這種情況下,您需要檢查最後一個變量是否已經填充以代替換行符,以確認讀取的正確性。它的工作原理是因爲列表變量在每次讀取之間都沒有設置,所以如果最後一個變量未被填充,那麼不管終止換行符如何,都沒有完整的讀取。所以在閱讀這裏之後,它是一個/或者測試。 –
謝謝大衛的輸入!我現在有一個關於添加密碼的問題,我實現了添加用戶「useradd -c」$ first $ mi $ last「$ uname」的命令,但現在我想實現passwd,我知道何時使用命令輸入密碼,然後驗證它。有沒有其他的選擇?我可以使用命令passwd ans提供useracct.txt的密碼嗎?謝謝,希望這是有道理的。 – johndoe11710