【问题标题】:Confused with shell script reading CSV data from file对从文件中读取 CSV 数据的 shell 脚本感到困惑
【发布时间】:2016-02-03 00:46:49
【问题描述】:

我对 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

有人可以帮帮我吗?

【问题讨论】:

    标签: linux shell centos sh


    【解决方案1】:

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

    您可以通过在IFS 中包含comma 来利用它来阅读诸如您的行之类的行。这将允许您指定单个变量以读取每个 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
    

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

    【讨论】:

    • || [ -n "$pw" ] 应该使用&amp;&amp; 吗?
    • 不,当处理具有非 POSIX 行结束的文件时,read 会将行读入各个变量,但由于缺少终止换行符而不会注册读取完成。在这种情况下,您检查是否已填充最后一个变量以代替换行符,以确认读取良好。它之所以有效,是因为在每次读取之间未设置列表变量,因此如果未填充最后一个变量,则无论终止换行符如何,都没有完整读取。因此,在此处阅读后,这是一个非此即彼的测试。
    • 感谢大卫的意见!我现在有一个关于添加密码的问题,我实现了添加用户“useradd -c”$first $mi $last“$uname”的命令,但现在我想实现passwd,我知道什么时候使用我有的命令输入密码,然后进行验证。有没有替代方案?我可以只使用命令 passwd ans 提供来自 useracct.txt 的密码吗?谢谢,希望这是有道理的。
    • 我只是尝试为每个单独的用户使用密码,并使用 passwd 命令分配它。谢谢
    • 抱歉,我正在讨论另一个问题。一般规则是,出于安全原因,您永远不要在变量等中存储或传递密码。但是,useradd 提供了-p 选项,该选项将采用密码as returned by crypt(3)
    猜你喜欢
    • 1970-01-01
    • 2013-07-15
    • 2019-03-18
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    相关资源
    最近更新 更多