zsh:从文件读取的选项卡的字符串不等于iteslf

时间:2018-03-07 19:58:58

标签: shell zsh

这让我完全难过 基本上,当我将一个字符串写入文件,然后将其读回时,字符串不等于自己 如何测试我从文件中读取的字符串是否等于预期值?

示例:

➜ foo="foo\tbar"
➜ echo $foo > foo.txt
➜ bar=`head -n 1 foo.txt`

➜ printf $foo | od -x
0000000 6261 6463 6509 6766
0000010

➜ printf $bar | od -x
0000000 6261 6463 6509 6766
0000010

➜ [ $bar != $foo ] && echo "they are not equal ????"
they are not equal ????

在我看来,这两个变量显然是相等的。为什么bash评估它们不相等?

如果我在字符串中没有\t的情况下运行上述测试,则​​相等的工作正常,所以我认为制表符与此有关。

但是,如果我使用包含的标签将$bar直接设置为$foo$bar=$foo),则等式通过,因此它不能直接导致字符串中的选项卡。

这里发生了什么?如何确保文件的第一行与带有制表符的字符串匹配?

所有测试均使用zsh运行。

1 个答案:

答案 0 :(得分:2)

<zsh echo的实施符合POSIX标准,因此\值中的文字字符tfoo会转换为将值写入foo.txt时的文字ASCII制表符。 printf也会处理\t。您可以使用foo看到bardeclare -p确实不同:

% declare -p foo bar
typeset foo='foo\tbar'
typeset bar=$'foo\tbar'

或正确使用printf

192% printf '%s' $foo | od -x
0000000      6f66    5c6f    6274    7261
0000010
192% printf '%s' $bar | od -x
0000000      6f66    096f    6162    0072
0000007

您还可以看到长度不同:

% echo ${#foo} ${#bar}
8 7

但是,您可能首先需要foo值的文字标签:

% foo=$'foo\tbar'
% printf '%s' $foo | od -x
0000000      6f66    096f    6162    0072
0000007