Shell 比较Unix中的文本

Shell 比较Unix中的文本,shell,unix,Shell,Unix,我试图比较Unix中的两个文本。我试过下面的方法。它不起作用。需要比较文件的第一行和最后一行 firstline=`head -1 test.txt` echo $firstline lastline=`tail -1 test.txt` echo $lastline if [ $firstline == $lastline ] then echo "Found" fi 当然,我错过了一些东西。请帮助。如果[“$firstline”=“$lastline”] 如果省略双引号,则如果行包含

我试图比较Unix中的两个文本。我试过下面的方法。它不起作用。需要比较文件的第一行和最后一行

firstline=`head -1 test.txt`
echo $firstline
lastline=`tail -1 test.txt`
echo $lastline
if [ $firstline == $lastline ]
then
   echo "Found"
fi
当然,我错过了一些东西。请帮助。

如果[“$firstline”=“$lastline”]

如果省略双引号,则如果行包含白色字符,则不起作用

假设您使用的是“某种”bourne shell,您应该(a)引用变量,并且(b)需要使用单个
=

if [ "$firstline" = "$lastline" ]
then
   echo "Found"
fi
更新作为对一些评论的回应,如果
$firstline
-z
,这也会起作用。即使在这种情况下,if语句也不会被解释为
if[-z…]
,至少在
ksh
(kornshell)或Bash中是如此(我没有一个带有普通bourneshell
sh
的系统可用)。

可能更简单一些

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

更新以回答Jan的问题。

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的
head
tail
命令行不同。

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

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

“它不起作用”太含糊了。它到底做了什么或没有做什么?不,
-eq
用于比较整数,如果您尝试,您会得到类似“…:integer expression expected”的错误。如果第一行是,比如说,
-z
?如果第一行是,
-z
?为什么要使用
sed
而不是问题中的
head
tail
?在我看来,它的可读性较差,我看不出有什么好处。@JanHudec:问得好。我希望我的更新能为您涵盖这些内容。如果第一行是,比如说,
-z
?(不过,我不是投反对票的人)。@Jan Hudec:谢谢你试图澄清,但这并没有什么坏处(至少它没有被解释为
[-z…]
)。对于@JanHudec的担忧,标准答案是将比较写如下:
如果[X“$firstline”=X“$lastline”]…
。很难看,但很管用。(哎哟。刚才注意到回复说了同样的话,但我不能删除我能说的评论。)我真的很好奇。我无法用ksh或bash重现“-z问题”(请参阅我答案的更新)。这只会发生在普通的老sh身上吗?(因为OP没有准确说出哪个外壳)。