困惑于shell脚本从文件中读取CSV数据

时间:2015-11-03 00:19:15

标签: linux shell centos sh

我是Linux / CentOS和shell脚本的新手。我们假设我有一个名为useraccounts.list的文件。此文件包含按特定顺序的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

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:2)

在了解如何存储密码之前,您需要弄清楚如何正确读取文件中的值。在bash中,确定shell如何将行分成单个标记的主要工具是Internal Field Separator(默认值:space tab newline)。该过程称为分词 IFS变量允许您设置将控制分词的字符。

通过在comma中添加IFS,您可以在阅读诸如此类的行中使用它。这样您就可以指定单个变量来读取每个nameinitiallastuser namepasswordwhile循环是实现此目的的常用方法 - 它允许您为该代码块设置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

然后,您可以使用所需选项创建用户帐户,并以您喜欢的方式存储密码。如果您有任何问题,请告诉我。