2014-12-02 52 views
1

我在寫一個小腳本。他有2個目的:在算術函數中包含數字的變量

檢查保存在兩個文件中的數小於60,則什麼也不做。

ELSE - 除以第二號的第一個數字,乘以100,並檢查結果大於20,如果是,運行DIFF上的文件,並將結果保存到文件中。

我在腳本的第一部分。我當前的代碼:

#!/bin/bash 

function timeDiff() { 

local time1=$(cat $1) 
local time2=$(cat $2) 

    echo $time1 
    echo $time2 

    if (("$time1" < 60)) && (("$time2" < "60")); then  

    echo No comparision needed.  

    else  
    diff $1 $2  

    fi 
} 

timeDiff 1/1.txt 2/1.txt 

的包含文件1.txt是:

1 
(one empty line here) 

的包含文件2.txt是:

2 
(one empty line here) 

對於這個腳本,我得到控制檯輸出這樣:

1 
2 
< 60 ")syntax error: invalid arithmetic operator (error token is " 
1c1 
< 1 
--- 
> 2 

如何使這個腳本工作?我用盡了一切......

+0

如果只想從文件的第一行則只有抓住從文件的第一行'時間1 =「$(頭-n 1‘$ 1’)」'(外側引號保護該行尾部的空白,你可能不希望在這種情況下,但通常是正確的事情)。 – 2014-12-02 13:39:28

+0

@EtanReisner:外部引號是否需要? 'x = $(echo'x');回聲「$ x。」' – choroba 2014-12-02 13:42:00

+0

@EtanReisner - 你的想法是去我的'best_bash_oneliners.txt',但它仍然無法正常工作。我已經測試過它:'if((70 <60))&&((70 <60));然後'它直接進入差異。寫'if((10 <60))&&((10 <60));然後'從回聲提出消息:'不需要比較'。所以問題仍然存在'$ time1'和'$ time2'變量。我不知道爲什麼... – dziki 2014-12-02 13:50:57

回答

3

好了,終於......所有的代碼是正確的...唯一的問題是我使用Cygwin在Windows上工作。我用記事本製作了1.txt ...

if (("$time1" < 60)) && (("$time2" < 60)); then 

工作正常。問題是

\r 

在TXT文件中。

運行在固定的一切這兩個文件dos2unix

+0

通過使用'read'獲取數字,您可以使代碼與具有Windows文件結尾的文件一起工作:'read time1 <「$ 1」;讀取時間2 <「$ 2」'。這也避免了創建子shell來讀取數字,但也可以通過將原始代碼改爲使用'$(<...)'而不是'$(cat ...)'來完成。 ('$(cat文件)'是[無用的貓的使用](http://www.smallo.ruhr.de/award.html)的一個例子。)使用'read'也可以避免讀取超過必要的輸入文件。您可以通過從測試中刪除不必要的標點符號來使代碼更加清晰:'if((time1 <60 && time2 <60)); then'。 – pjh 2014-12-02 19:28:37

0

刪除報價從60取而代之的

&& (("$time2" < "60")); 

嘗試:

&& (($time2 < 60)); 
+0

它仍然不工作:( – dziki 2014-12-02 13:36:14

+0

刪除這樣的引號幾乎總是錯誤的建議。 – 2014-12-02 13:36:52