2012-03-02 94 views
0

我想比较Unix中的两个文本。我尝试了下面。它没有工作。需要比较文件的第一行和最后一行。比较Unix中的文本

firstline=`head -1 test.txt` 
echo $firstline 
lastline=`tail -1 test.txt` 
echo $lastline 
if [ $firstline == $lastline ] 
then 
    echo "Found" 
fi 

当然,我错过了一些东西。请帮忙。

+0

“它没有工作”太含糊。究竟做了什么或没有做什么? – 2012-03-02 09:09:13

+0

你在使用哪种外壳? – 2012-03-02 09:12:46

回答

1

也许更简单...

bash-3.2$ if [ "$(sed -n '1p' file)" = "$(sed -n '$p' file)" ]; then 
    echo 'First and last lines are the same' 
else 
    echo 'First and last lines differ' 
fi 

更新回答简的问题。

bash-3.2$ cat file 
-z 
-G 
bash-3.2$ if [ "$(sed -n '1p' file)" = "$(sed -n '$p' file)" ]; then 
>  echo 'First and last lines are the same' 
> else 
>  echo 'First and last lines differ' 
> fi 
First and last lines differ 

我喜欢sed为抓住一个文件的第一行和最后一行,因为相同的命令行工作在Linux,Mac OS和Solaris。 Linux和Solaris之间的headtail命令行不同。

+0

如果第一行是'-z',该怎么办? – 2012-03-02 09:18:27

+0

为什么你在问题中使用'sed'而不是'head'和'tail'?在我看来,它的可读性较差,我没有看到任何优势。 – 2012-03-02 12:01:33

+0

@JanHudec:好问题。我希望我的更新能为你提供帮助。 – Johnsyweb 2012-03-02 22:07:56

0

应该if [ "$firstline" = "$lastline" ]

如果省略了双引号,如果线(S)含有白色字符,它不会工作。

+0

不,'-eq'用于比较整数,如果您尝试,则会得到类似于“...:整数表达式”的错误。 – 2012-03-02 09:11:27

+0

是的,你是对的,只是修复它。 – sirgeorge 2012-03-02 09:12:24

+0

如果第一行是'-z',该怎么办? – 2012-03-02 09:19:03

1

假设您正在使用“某种形式”的Bourne shell的,你应该(一)引用变量和(b)需要使用一个单一的=

if [ "$firstline" = "$lastline" ] 
then 
    echo "Found" 
fi 

更新在回应一些评论如果$firstline-z,这也将起作用。即使在这种情况下,if语句是而不是解释为if [ -z ... ],至少在ksh(Korn Shell)或Bash(我没有可用的简单Bourne shell shell sh的系统)。

+1

为什么downvote? – 2012-03-02 09:13:52

+0

如果第一行是'-z',该怎么办? (虽然我并不是那种低调的人)。 – 2012-03-02 09:18:53

+0

@Jan Hudec:谢谢你试图澄清,但是这并没有伤害(至少它不会被解释为'[-z ...]')。 – 2012-03-02 09:23:17

0

至少,您必须引用变量扩展。另外,如果字符串以-开头,则应添加前缀以避免出现问题。并且正确的运算符是=。所以它应该是

if [ "x$firstline" = "x$lastline" ] 
+1

我很好奇。我无法用ksh或bash重现“-z Issue”(请参阅​​我的答案的更新)。它只发生在简单的老sh? (由于OP没有完全告诉哪个外壳)。 – 2012-03-02 09:51:54