这让我完全难过 基本上,当我将一个字符串写入文件,然后将其读回时,字符串不等于自己 如何测试我从文件中读取的字符串是否等于预期值?
示例:
➜ 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运行。
答案 0 :(得分:2)
zsh
echo
的实施符合POSIX标准,因此\
值中的文字字符t
和foo
会转换为将值写入foo.txt
时的文字ASCII制表符。 printf
也会处理\t
。您可以使用foo
看到bar
和declare -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