将字符串附加到带有分隔符的变量

将字符串附加到带有分隔符的变量

我需要帮助解决这个问题,我有一个包含名称列表的文件:

姓名.txt

roger
peter
henry

我想:在每个名字后连接

for i in $(cat names.txt); do
   $i+=$i":"
done 

我想要的输出是这样的roger:peter:henry

但我得到这个输出roger:peter:henry:

答案1

有一个工具可以为您做到这一点:paste

$ paste -sd: names.txt
roger:peter:henry

答案2

sed与 的替代解决方案tr

sed '$!s/$/:/' names.txt | tr -d '\n'

输出:

roger:peter:henry

答案3

paste是适合这项工作的工具。但为了完整起见,以下是您尝试执行的操作的方法:

k="$(head -n1 names.txt)";
for i in $(tail -n+2 names.txt); do 
    k="$k:$i"; 
done

这会产生:

$ echo "$k"
roger:peter:henry

答案4

$i+=$i":"

这不会做你想做的事。相反,它会$i在标记的位置展开,并尝试将结果作为命令运行。 shell 赋值不会采用左侧的美元符号(将其视为采用变量的值,这里我们不需要它,而是要存储的位置)。应该是i+=$i":"相反。或者最好i+="$i:"只是养成引用 shell 变量扩展的习惯。

此外,您尝试附加到用作循环变量的变量。这不是很有用,因为它会在下一轮循环中被覆盖。另外,您要在每一项(包括最后一项)后面添加一个冒号,这样您就会在末尾看到一个冒号。但我们可以在${var%suffix}扩展后将其删除。

所以:

s=
for i in $(cat names.txt); do
   s+="$i:"
done 
s=${s%:}

但请注意,不带引号的扩展$(cat)将处理任何文件名通配符模式(glob),因此文件中的一行*将扩展为当前目录中的所有文件等。

相关内容