1

我有一个关于 Linux 中的 shell 脚本的问题。我一直试图让这段代码工作几个小时,它做了一些我不明白的事情。代码的目的是在 csv 文件中添加用户的名称、gecos 和组的值。csv 文件的格式如下:

U12341;Mario Speedwagon;docent
U12342;Petey Cruiser;classA

这是我的代码,我临时删除了 useradd 中的 group 函数,因为这样更容易调试。它一直告诉我 ` 是该组的无效名称。所以我试着用回声把变量放在屏幕上,发现一些对我来说很奇怪的东西。

for actie in `more +2 users.csv | tr " " "_"`
do
login=`echo $actie | tr ";" ":" | cut --delimiter=: --field=1 | tr '[A-Z]' '[a-$
groep=`echo $actie | tr ";" ":" | cut --delimiter=: --field=3`;
gecos=`echo $actie | tr ";" ":" | cut --delimiter=: --field=2 | tr "_" " "`;

echo "In login ($login), in gecos ($gecos) en in groep ($groep)"
sudo useradd $login -c "$gecos"
echo "User $login is toegevoegd onder de naam $gecos in groep $groep"

done

这是奇怪的输出:

)n login (u12341), in gecos (Mario Speedwagon) en in groep (docent
useradd: user 'u12341' already exists
User u12341 is toegevoegd onder de naam Mario Speedwagon in groep docent
)n login (u12342), in gecos (Petey Cruiser) en in groep (classA
useradd: user 'u12342' already exists

似乎将 $group 之后的字符放在字符串的第一个字符上。我认为我使用相同的变量作为组名的问题是完全相同的。

其他一切似乎都很好,如果我在没有组代码的情况下运行脚本,它会为用户添加正确的 gecos 数据。

以前有人遇到过这样的问题吗?提前致谢。

4

1 回答 1

1

csv 文件是在 Windows 机器上制作的吗?Windows 以回车 + 换行符 ( \r\n) 结束行,而 Linux 仅使用换行符 ( \n)。我的猜测是它包括变量\r中每行末尾的回车。groep然后,当它回显该变量时,\rwithout\n将光标发送到行首而不移动到下一行。(为了演示,请尝试echo -e "Here's a line of text to print with a \rcarriage return in the middle."

我不知道一种自动删除 CR 的方法(我会看看能不能找到一个),但是您可以通过 sed 或其他方式运行文件并删除所有出现的\r.

编辑:
选项1:安装dos2unix(标准)
选项2:(从这里tr -d '\r' < input.file > new.file解除) 选项3:显然只是运行会去掉回车。我没有文件可以测试它,但你可以试一试。
cat oldfile.csv > newfile.csv

于 2013-04-10T22:44:30.453 回答