2016-05-11 15 views
1

私はコマンドラインから3つのパラメータを取るbashスクリプトを持っています。ディレクトリ内のすべてのファイルを比較して、最初の2つのパラメータのタイプであるかどうかを確認します。そうであれば、FFMPEGコマンドを使用して、そのようなファイルを3番目のパラメーターのタイプに変換します。これは、このスクリプトは、.flvのためにaviファイルや.MP4ファイルのすべてを変換することを予期せぬトークンの近くにbashスクリプトの `do 'があります

./convert.sh .avi .mp4 .flv 

:私は、次のコマンドでスクリプトを実行します。

私はスクリプトを実行すると、私はここでエラーに

syntax error near unexpected token `do' in bash script. 

を取得するコードです:

#!/bin/bash 

# $1 is the first parameter passed 
# $2 is the second parameter passed 
# $3 is the third parameter passed 

for file in *.*; 
    do 
     #comparing the file types in the directory to the first 2 parameters passed 
     if[ (${file: -4} == "$1") || (${file: -4 } == "$2") ]{ 
      export extension=${file: -4} 
      #converting such files to the type of the first parameter using the FFMPEG comand 
      do ffmpeg -i "$file" "${file%.extension}"$3; 
done 
+1

を – sjsam

+0

[shellcheck](http://www.shellcheck.net/)を使用してコードをテストし、私がやりました私はbashの初心者です。私はshellcheckのエラーメッセージのいくつかをよく理解していません。私が間違って行ったことのヒントがあれば大歓迎です。 – Avi

+1

正直言って、このスクリプトではシバン線だけが正しいことがわかります。 – heemayl

答えて

0

あなたの書式や構文を持ついくつかの問題があります。 shellcheckを使用するsjsamのアドバイスは良いですが、短いバージョンでは、あなたのif文の内部ブラケットの角括弧の代わりに、丸いものを使用しなければならないということである。

if [ ${file: -4} == "$1" ] || [ ${file: -4 } == "$2" ] { 

をそして私はあなたが必要とは思いません "あなたのffmpegのラインまたは上の行の末尾の中括弧の前に」を実行するので、あなたはここで構文エラーの束があります

for file in *.*; 
    do 
    #comparing the file types in the directory to the first 2 parameters passed 
    if [ ${file: -4} == "$1" ] || [ ${file: -4 } == "$2" ] 
     export extension=${file: -4} 
     #converting such files to the type of the first parameter using the FFMPEG comand 
     ffmpeg -i "$file" "${file%.extension}"$3; 
    fi 
done 
+0

ソリューションは機能しました。それが私のバグでした! – Avi

+1

ゴードンの答えは私のものよりもはるかに徹底していますが、私は 'スペースが足りない場合は訂正しましたが、言及するのを忘れてしまいました。 – Greg

3

...で終わります。行で始まるのをしてみましょう:

if[ (${file: -4} == "$1") || (${file: -4 } == "$2") ]{ 
  • あなたがif[(または何それの後に来る)との間にスペースが必要です。書かれているように、シェルは "if"をコマンドの名前として扱います。これはあなたが望むものではありません。条件付きの

  • [ ... ]スタイルは||を理解する(それが代わりに-oを使用しています)、(括弧のような)すべてのシェルのメタ文字をエスケープまたは引用されている必要があり、==を理解していない可能性があります(ただ=が標準です)、そして意志はありません引用符で囲まれていない変数/パラメータ参照のいずれかが空白の場合、非常に混乱します。 「あなた以来

    if [ \("${file: -4}" = "$1" \) -o \("${file: -4}" = "$2" \) ]; then 
    

    または、:

  • if条件文は、あなたがこのようにそれを修正することができます(次の行に、または;後のいずれか)ではない{

thenで終了しますbash(より基本的なシェルではなく)を使用している場合は、[[ ... ]]の条件付きスタイルを使用できます。これは、より洗練された構文を持っています。

if [[ "${file: -4}" = "$1" || "${file: -4}" = "$2" ]]; then 

ffmpegの前にdoを削除します。 doは、forwhileループの構文の一部です。あなたはすでに(それが所属する)上記のものを持っています、そして、これはちょうど意味がありません。これはあなたが見ているエラーの原因です。

次に、ファイルの拡張子を置き換える方法は正しく機能しません。変数参照"${file%.extension}"$3は、$fileの末尾にある "拡張子"(変数ではなく、文字列)を削除しようとします。また、引用符の外に$3があり、問題を引き起こす可能性があります。代わりに"${file%$extension}$3"を使用して修正することができますが、私はちょうど"${file%.*}$3"を使用して延長を削除します(同じように、ifの比較もやり直していますが、それはもっと複雑です)。

最後に、条件付きで終了するにはfiffmpeg行の後)が必要です。 ifには、thenfiが必要です。

文体のように、シェルの行末に;は必要ありません。同じ行に複数のコマンド(またはdothenなど)を置いている場合にのみ必要です。とにかく、ここに私の迅速な書き直しです:

#!/bin/bash 

# $1 is the first parameter passed 
# $2 is the second parameter passed 
# $3 is the third parameter passed 

for file in *.*; do 
    #comparing the file types in the directory to the first 2 parameters passed 
    if [[ "${file: -4}" = "$1" || "${file: -4}" = "$2" ]]; then 
     #converting such files to the type of the first parameter using the FFMPEG comand 
     ffmpeg -i "$file" "${file%.*}$3" 
    fi 
done 
1

スクリプトは単純に減らすことができます。

#!/bin/bash 

for file in *; do 
    [[ ${file: -4} = $1 || ${file: -4} = $2 ]] && ffmpeg -i "$file" "${file%.*}$3" 
done 
関連する問題