无法正确识别Linux脚本变量

时间:2013-04-10 22:33:44

标签: linux shell scripting

我对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数据。

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

1 个答案:

答案 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将删除回车。我没有要测试它的文件,但你可以尝试一下。