我对Linux中的shell脚本有疑问。 我一直在努力让这段代码工作几个小时,而且它做了一些我不明白的事情。代码的目的是在csv文件中为用户添加名称,gecos和group的值。 csv文件的格式如下:
U12341;Mario Speedwagon;docent
U12342;Petey Cruiser;classA
这是我的代码,我在useradd临时删除了组函数,因为它更容易调试。它一直告诉我“这是一个无效的名字。所以我尝试用变量将变量放在屏幕上,并注意到一些非常奇怪的东西。
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数据。
之前有人遇到过这样的问题吗? 提前谢谢。
答案 0 :(得分:1)
csv文件是在Windows机器上制作的吗? Windows以回车符+换行符(\r\n
)结束行,而Linux仅使用换行符(\n
)。我的猜测是它包含了\r
变量中每行末尾的回车groep
。然后当它回显该变量时,\r
没有\n
将光标发送到行的开头而不移动到下一行。 (要演示,请尝试echo -e "Here's a line of text to print with a \rcarriage return in the middle."
)
我不知道现有的剥离CR的方法(我会看看我能找到一个),但你可以通过sed或其他东西运行文件并删除所有出现的{{1} }。
编辑:
选项1:安装\r
(标准)
选项2:dos2unix
(从here解除)
选项3:显然只是运行tr -d '\r' < input.file > new.file
将删除回车。我没有要测试它的文件,但你可以尝试一下。