Shell 比较Unix中的文本
我试图比较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”] 如果省略双引号,则如果行包含
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中是如此(我没有一个带有普通bourneshellsh
的系统可用)。可能更简单一些
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没有准确说出哪个外壳)。