我正在编写一个需要在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>
这样的脚本,结果相同。
非常感谢所有建议!
答案 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