将字符连接到Bash中的变量值

时间:2017-11-28 21:35:09

标签: bash

首先,我希望你们知道我做了我的研究,当然找到了大量关于这个主题的文档,但是没有一个有效。

我有一个文本文件,每行代码为:

newUserToAdd,inThisGroup

即:

约翰,客户端

因此,如果用户列表尚未存在,请尝试创建用户列表,并将其置于此组中。问题是,如果组名是文本文件是客户端,我希望计算机中的组名是"客户端"。所以我需要添加" s"字符。我尝试了很多方法,但没有一种方法可行。

如果这有助于理解我的脚本。

  for line in `cat /home/jonathan/Desktop/Utilisateurs.txt`
  do
   echo $line > /dev/null
   user=`echo $line | cut -d "," -f1`
   group=`echo $line | cut -d "," -f2`
   groups=${group}"s"

  if [ `grep $group /etc/group` ] ; then 
   echo "Ce groupe existe. Aucune action à faire."
  else
   #echo "Ce groupe n'existe pas. Création immédiate."
   echo $groups
   #groupadd $groups
  fi
  done

但它一直给我这种输出......(我的名单中有3个组名,法语:" Superviseur"," Technicien" && #34;客户端"。控制台输出是:

    superviseur
    sechnicien
    sechnicien
    slient
    slient
    slient
    superviseur

为什么不断更改第一个字母而不是在结尾添加字母?

非常感谢你的时间!

1 个答案:

答案 0 :(得分:0)

这可能是由Utilisateurs.txt文件中每行末尾的回车引起的。使用dos2unix实用程序将\r\n(Windows样式的换行符)转换为\n(Unix样式的换行符)。

此实用程序可以在存储库中找到,具体取决于您的分发(例如,在Canonical repository中),也可以手动创建(例如,快速sed script)。

您遇到此问题的原因是回车(\r)将光标拉到线的左侧而不将光标向下移动一行。这在某些情况下很有用,例如当您想要重写当前行时。但是,这可能不是你在这里寻找的。

对于更多上下文,Bash使用其内部字段分隔符(IFS)来确定在for等命令中处理字符串时的分隔符。 Bash中的默认IFS是$' \n\t',其中包括空格,换行符和制表符,但不包括回车符。这意味着您的for - 循环将在换行符上分开,但会保持回车不变。