2010-04-23 5 views
1

Je suis en train de construire un script (je suis assez nouveau pour les scripts Linux) et je n'arrive pas à comprendre pourquoi je ne suis pas capable d'exécuter ce script. Si je garde l'en-tête (#!/Bin/sh) dans, je reçois le texte suivant:CentOS - Convertir chaque fichier WAV en MP3/OGG

-bash: /tmp/ConvertAndUpdate.sh: /bin/sh^M: bad interpreter: No such file or directory 

Si je le prends, je reçois le texte suivant:

'tmp/ConvertAndUpdate.sh: line 2: syntax error near unexpected token `do 
'tmp/ConvertAndUpdate.sh: line 2: `do 

Toutes les idées? Voici le script complet:

#!/bin/sh 
for file in *.wav; do 
    mp3=$(basename .$file. .wav).mp3; 
    #echo $mp3 
    nice lame -b 16 -m m -q 9 .resample 8 .$file. .$mp3.; 
    touch .reference .$file. .$mp3.; 
    chown apache.apache .$mp3.; 
    chmod 600 .$mp3.; 
    rm -f .$file.; 
    mv .$file. /converted; 
    sql="UPDATE recordings SET IsReady=1 WHERE Filename='${file%.*}'" 
    echo $sql | mysql --user=me --password=pasword Recordings 
    #echo $sql 
done 

Répondre

1

Vous pouvez réellement avoir un caractère non-impression là-dedans. Vous avez probablement enregistré ce fichier sous Windows avec les fins de ligne "\ r \ n" à la place des terminaisons "\ n" UNIX habituelles. Utilisez dos2unix pour le réparer. En outre, juste quelques choses ....

Vous ne semblez pas citer "$ file" ou aucune de ces autres variables ... ainsi votre script pourrait fonctionner s'il n'y a aucun espace dans l'un des noms de fichiers, mais vous pouvez parier qu'il va se casser s'il y a des espaces. Chaque fois que vous utilisez une variable, il est très important de s'assurer qu'elle reste correctement citée. Contrairement à C++ et Java, le point-virgule dans le script shell est utilisé pour séparer et non terminer les instructions. Vous ne devriez pas mettre des points-virgules à la fin des déclarations; vous ne devez utiliser des points-virgules que si vous souhaitez utiliser plusieurs instructions par ligne.

Il existe plusieurs interpréteurs différents. Si vous utilisez /bin/sh, seules les fonctionnalités minimales requises par POSIX sont garanties. Si vous envisagez d'utiliser des fonctionnalités spécifiques à BASH, utilisez /bin/bash. Par habitude, j'utilise #! /bin/bash sauf si j'ai absolument besoin de cibler seulement /bin/sh, auquel cas je fais aussi un examen très complet de mon code pour m'assurer que je n'utilise aucune fonctionnalité au-delà de celles de /bin/sh.

J'ai fixé une partie de votre script shell comme suit:

 
#! /bin/bash 
for file in *.wav; do 
    filebasename=`basename "$file" .wav` 
    filemp3="$filebasename.mp3" 
    nice lame -b 16 -m m -q 9 --resample 8 "$file" "$filemp3" 
    #.... 
done 

Je ne sais pas exactement ce que vous essayez de faire avec le reste.

+0

Très bien! Je vous remercie! – Benny

0

Vous avez apparemment enregistré le fichier avec les fins de ligne CRLF au lieu des fins de ligne LF appropriées. Le ^M est le cadeau.

Modifiez le fichier en fins de ligne LF.

Questions connexes