Linux 计算唯一值在shell中直接起作用,但在backticks中不起作用

Linux 计算唯一值在shell中直接起作用,但在backticks中不起作用,linux,bash,Linux,Bash,我试图从命令行中找出这一点的原因,但是当它位于变量中时,我试图计算一个数字的唯一出现次数 $ echo 1,1,2,3,4,5 | tr , \\n | sort -u | wc -l 5 $ test=`echo 1,1,2,3,4,5 | tr , \\n | sort -u | wc -l` $ echo $test 1 我假设它在变量中被视为一行,但不确定为什么以及如何处理它 谢谢 通过将设置为-x,您可以看到发生了什么: $ test=`set -x; echo 1,1,2,3,4,

我试图从命令行中找出这一点的原因,但是当它位于变量中时,我试图计算一个数字的唯一出现次数

$ echo 1,1,2,3,4,5 | tr , \\n | sort -u | wc -l
5
$ test=`echo 1,1,2,3,4,5 | tr , \\n | sort -u | wc -l`
$ echo $test
1
我假设它在变量中被视为一行,但不确定为什么以及如何处理它


谢谢

通过将
设置为-x
,您可以看到发生了什么:

$ test=`set -x; echo 1,1,2,3,4,5 | tr , \\n | sort -u | wc -l`
++ echo 1,1,2,3,4,5
++ tr , n
++ wc -l
在这里您可以看到
\n
变成
n

\n
的转义失败;试一试

test=`echo 1,1,2,3,4,5 | tr , '\n' | sort -u | wc -l`
引号将防止“\”褪色

甚至

 test=$(echo 1,1,2,3,4,5 | tr , '\n' | sort -u | wc -l)

由于我们通常倾向于使用$()而不是可能导致其他类型问题的反报价

您可以通过放置
set-x来查看发生了什么:

$ test=`set -x; echo 1,1,2,3,4,5 | tr , \\n | sort -u | wc -l`
++ echo 1,1,2,3,4,5
++ tr , n
++ wc -l
在这里您可以看到
\n
变成
n

\n
的转义失败;试一试

test=`echo 1,1,2,3,4,5 | tr , '\n' | sort -u | wc -l`
引号将防止“\”褪色

甚至

 test=$(echo 1,1,2,3,4,5 | tr , '\n' | sort -u | wc -l)

由于我们通常倾向于使用$()而不是可能导致其他类型问题的反报价,因此使用
awk
可以避免所有管道命令:

count=$(echo 1,1,2,3,4,5 | awk -v RS=, '!seen[$1]++{c++} END{print c}')
echo $count
5

使用
awk
可以避免所有管道命令:

count=$(echo 1,1,2,3,4,5 | awk -v RS=, '!seen[$1]++{c++} END{print c}')
echo $count
5

另一方面,您也可以在纯bash中实现这一点,不使用
sort
tr
wc
。在shell命令执行的时间尺度上,设置管道有相当大的开销;同样地调用外部命令(即使这些外部命令一旦运行,它们的执行速度实际上比使用内置命令的实现要快);声明-a VAL=();而read-r-d,val;do val[$val]=1;另外,您还可以在纯bash中实现这一点,而无需
排序
tr
wc
。在shell命令执行的时间尺度上,设置管道有相当大的开销;同样地调用外部命令(即使这些外部命令一旦运行,它们的执行速度实际上比使用内置命令的实现要快);声明-a VAL=();而read-r-d,val;do val[$val]=1;完成后,我还建议使用
$()
语法而不是反斜杠--不仅修复了反斜杠的直接问题,而且更容易阅读和嵌套。我还建议使用
$()
语法而不是反斜杠--不仅修复了反斜杠的直接问题,而且更容易阅读和嵌套。