Bash转置无法正常工作

时间:2014-05-19 18:38:51

标签: bash

我正在编写一个需要在bash中使用Ubuntu和Mint的脚本。我从一个名为fifo的管道中读取了一个这样的字符串4:3:cdefg,两个数字和一个带冒号的单词。然后,在bash脚本中,我尝试用'\ n'newline 字符替换每个':'冒号字符。而不是如下的输出:

4
3
cdefg

我得到了

4 3 cdefg

所有冒号都被''空格字符替换。

脚本中的命令是

echo $line | tr ':' '\n'

其中$ line从循环中的命名管道读入。如果我直接在终端

中试用它,它的效果非常好
echo "4:3:cdefg" | tr ':' '\n'

可能有什么不对?如果我理解正确,命名管道只将接收到的字节传递给侦听进程,并且不会更改编码,因此它也应该在脚本中工作。 我在bash中运行脚本,而不是sh,因为我在第一行有#!/bin/bash。我也试过运行像bash -xv <script name>这样的脚本,结果相同。

非常感谢所有建议!

1 个答案:

答案 0 :(得分:3)

你实际上并没有发布你运行的代码,但这是我想象你正在做的事情:

$ cat yourscript
line="4:3:cdefg"
transposed=$(echo $line | tr ':' '\n')
echo $transposed

$ bash yourscript
4 3 cdefg

以下是shellcheck对此的评价:

$ shellcheck yourscript
In yourscript line 3:
echo $transposed
     ^-- SC2086: Double quote to prevent globbing and word splitting.

如果我们应用其建议,会发生什么:

$ cat yourscript
line="4:3:cdefg"
transposed=$(echo $line | tr ':' '\n')
echo "$transposed"

$ bash yourscript
4
3
cdefg