与 shell 脚本从文件中读取 CSV 数据混淆
Confused with shell script reading CSV data from file
我对 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 " "
done <file.txt
有人可以帮我吗?
在了解如何存储密码之前,您需要弄清楚如何正确地从文件中读取值。在 bash 中,确定 shell 如何将一行分成单个标记的主要工具是 Internal Field Separator
(默认值:space tab newline
)。该过程称为 分词 IFS
变量允许您设置控制分词的字符。
您可以通过在 IFS
中包含 comma
来利用它来阅读像您这样的行。这将允许您指定单独的变量来读取每个 name
、initial
、last
、user name
和 password
。 while
循环是完成此操作的常规方法——它允许您为该代码块设置 IFS
而不会影响脚本的其余部分。
在您的例子中,示例是:
#!/bin/bash
[ -z "" ] && { ## validate one argument given on command line
printf "error: insufficient input. usage: %s filename.\n" "${0##*/}"
exit 1
}
[ -r "" ] || { ## validate it is a readable filename
printf "error: file not found/readable '%s'.\n" ""
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 <""
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
然后您可以使用所需的选项创建用户帐户并以您喜欢的任何方式存储密码。如果您有任何问题,请告诉我。
我对 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 " "
done <file.txt
有人可以帮我吗?
在了解如何存储密码之前,您需要弄清楚如何正确地从文件中读取值。在 bash 中,确定 shell 如何将一行分成单个标记的主要工具是 Internal Field Separator
(默认值:space tab newline
)。该过程称为 分词 IFS
变量允许您设置控制分词的字符。
您可以通过在 IFS
中包含 comma
来利用它来阅读像您这样的行。这将允许您指定单独的变量来读取每个 name
、initial
、last
、user name
和 password
。 while
循环是完成此操作的常规方法——它允许您为该代码块设置 IFS
而不会影响脚本的其余部分。
在您的例子中,示例是:
#!/bin/bash
[ -z "" ] && { ## validate one argument given on command line
printf "error: insufficient input. usage: %s filename.\n" "${0##*/}"
exit 1
}
[ -r "" ] || { ## validate it is a readable filename
printf "error: file not found/readable '%s'.\n" ""
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 <""
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
然后您可以使用所需的选项创建用户帐户并以您喜欢的任何方式存储密码。如果您有任何问题,请告诉我。