2016-12-08 4 views
-1

いくつかの日付条件に基づいてクリーンアップのためのスクリプトを作成しました。しかし、私はエラーが発生しています。Bash - 構文エラー:予期しないファイルの末尾

#!/bin/bash 
echo "Process Started" 
Current_Date=`date +%Y-%m-%d` 
echo "todays Date ==> $Current_Date" 
fromDate=$1 
toDate=$2 
oldDate=`date --date="3 years ago" +%Y-%m-%d` 
echo "Two Yrs Back Date ==> $oldDate" 
if [ $toDate -le $oldDate ] 
then 
find . -type f -newermt $fromDate ! -newermt $toDate -exec truncate -s 0 {} \; && echo "truncated" 
else 
echo "todate should be less than three years" 
fi 
echo "Done" 

エラーを取得する - line 15: syntax error: unexpected end of file ライン15ではありませんが、スクリプトはわずか14行があります。また、bashスクリプトはコマンドecho "Two Yrs Back Date ==> $oldDate"まで正常に実行されます。 その後、ifの状態が始まるとエラーが発生します。 私が作っている構文エラーをチェックしたかっただけです。

+1

すべてのvarsを引用してください。 – 123

+0

bashスクリプトは 'echo 'コマンドまでうまく動く2 Yrs Back Date ==> $ oldDate" 'その後、if条件が始まるとエラーを出します。 – Sam

+0

'bash -n yourscpript'とは何ですか? 'od -c yourscript'を実行すると面白い文字(\ nの代わりに\ r)がありますか? – Jens

答えて

-1

演算子-leは、文字列ではなく整数を比較するためのものです。

は厳密より少なくより等しい少ない又は-または

if [[ "$toDate" < "$oldDate" ]] || [[ "$toDate" = "$oldDate" ]] 

ため

if [[ "$toDate" < "$oldDate" ]] 

を試してみてください。

http://www.tldp.org/LDP/abs/html/comparison-ops.htmlを参照)

+0

これは構文エラーを解決しません。また、POSIXは '<'の演算子として '<'を指定していないので、 '<[$ toDate <$ oldDate] 'を使うこともできます。さらに、 '-o'は廃止されたとみなされます。代わりに '||'で結合された2つのコマンドを使うべきです: '[...] || [...] '。 – chepner

0

この使用する:あなたは条件付き構文[[]]でlexicographicallyを比較することができ

#!/bin/bash 

echo "Process Started" 
Current_Date=$(date +%Y-%m-%d) 
echo "todays Date ==> $Current_Date" 

fromDate=$1 
toDate=$2 
oldDate=$(date --date="3 years ago" +%Y-%m-%d) 
echo "Two Yrs Back Date ==> $oldDate" 

if [[ "$toDate" < "$oldDate" ]] || [[ "$toDate" = "$oldDate" ]]; then 
    find . -type f -newermt "$fromDate" ! -newermt "$toDate" -exec truncate -s 0 {} \; && echo "truncated" 
else 
    echo "todate should be less than three years" 
fi 
echo "Done" 

を。 bashで日付を比較するには、使用する必要があります。whoan答えから抽出

[[ expression ]] 
Return a status of 0 or 1 depending on the evaluation of the conditional expression expression

shellcheckツールを使用して、警告のクリーンです

this postに。問題を避けるためにヴァルスを引用することを忘れないでください! ^-- SC2053: Quote the rhs of = in [[ ]] to prevent glob matching

1

あなたが引用符を必要とする拡張のかなり多くを持っている:shellcheckはこのようなもの見せているスクリプトを呼び出した方法を見ることなく

if [ "$toDate" -le "$oldDate" ] 

find . -type f -newermt "$fromDate" ! -newermt "$toDate" 

を、それはこれらがあなたの問題に貢献しているかどうかを知るのは難しいです、とにかくそれらは固定されるべきです。

あなたはそれが一貫して、あまりにも、割り当てのための変数を引用するのに役立ちます見つけることがあります。

fromDate="$1" 
toDate="$2" 

-leは整数を必要とするスクリプトはまた、9行目で失敗した - あなたはおそらく形式dateを与えることを意味し同等の整数を得るには+%sのような文字列を使用します。

脇に、truncateのような破壊的なコマンドをあなたのコード例に入れないでください。ちょうどechoか何かの代わりに十分であるべきです。

+0

割り当ては引用符で囲む必要はありませんが、もちろんそれは怪我をすることはありません。 –

+1

ありがとう@BenjaminW - 私はいつも私の言葉を引用し、それが必要ではないことを認識していませんでした。回答が更新されました。 –

関連する問題