2012-03-02 93 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