erreur de syntaxe près de jeton inattendu "faire" dans le script bash
J'ai des script bash qui prend 3 paramètres à partir de la ligne de commande. Il compare tous les fichiers dans le répertoire pour voir si elles sont du type de la première 2 paramètres. Si elles le sont, le script convertit les fichiers tels le type de la troisième paramètre à l'aide d'un FFMPEG commande. Je voudrais exécuter le script avec la commande suivante:
./convert.sh .avi .mp4 .flv
Que cela, ce script serait de convertir toutes les .avi et .fichiers mp4 pour .flv.
Quand je lance le script, j'obtiens l'erreur
syntax error near unexpected token `do' in bash script.
Voici le code:
#!/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
- Tester votre code avec shellcheck
- Je l'ai fait mais je suis un débutant en bash. Je ne comprends pas certains messages d'erreur bien sur shellcheck. Aucune indication de l'endroit où je suis allé mal serait grandement apprécié.
- Pour être honnête, je peux voir seulement la ligne shebang est correcte dans ce script 😐
Vous devez vous connecter pour publier un commentaire.
Vous avez quelques problèmes avec votre mise en forme et de la syntaxe. sjsam conseils d'utilisation shellcheck est bonne, mais la version courte est que vous devriez être en utilisant des crochets à la place de rondes sur les supports internes de votre déclaration si:
Et je ne pense pas que vous avez besoin de le "faire" avant votre ffmpeg ligne ou l'accolade à la fin de la ligne ci-dessus, si vous vous retrouvez avec...
Il y a un tas d'erreurs de syntaxe ici. Commençons par la ligne:
Vous avez besoin d'un espace entre
if
et[
(ou tout ce qui vient après). Comme l'écrit, le shell est le traitement de "if[" comme le nom d'une commande, ce qui n'est pas ce que vous voulez.La
[ ... ]
style de la réserve de ne pas comprendre||
(il utilise-o
au lieu de cela), exige que tous les shell métacaractères (comme entre parenthèses) être échappé ou cités, pourraient ne pas comprendre==
(juste=
est la norme), et très confus si l'une des sociétés non cotées variable/paramètre références sont vides.if
conditionnelles fin avecthen
(soit sur la ligne suivante, ou après un;
) pas{
Vous pu le résoudre comme ceci:
Ou, depuis que vous utilisez
bash
(au lieu de plus de base en shell), vous pouvez utiliser le[[ ... ]]
style conditionnel, qui est beaucoup plus propre syntaxe:Ensuite, retirez le
do
avantffmpeg
.do
fait partie de la syntaxe defor
etwhile
boucles; vous avez déjà ci-dessus (où il appartient), et celui-ci n'a pas de sens. C'est ce qui est la cause de l'erreur que vous voyez.Ensuite, la façon dont vous êtes en remplaçant l'extension du fichier ne fonctionne pas droit. La variable de référence
"${file%.extension}"$3
va essayer de supprimer ".extension" (pas la variable, il suffit de la chaîne) à partir de la fin de$file
. Il a également$3
à l'extérieur de la cite, qui peut causer des problèmes. Vous avez pu le résoudre en utilisant"${file%$extension}$3"
à la place, mais franchement, je venais d'utiliser"${file%.*}$3"
pour supprimer l'extension de n'importe quelle longueur il est (et je voudrais aussi refaire leif
comparaisons de même, mais c'est plus compliqué).Enfin, vous avez besoin d'un
fi
(après laffmpeg
ligne) à la fin du conditionnel. Chaqueif
besoin d'unthen
et unfi
.Et juste comme une figure de style chose, vous n'avez pas besoin
;
à la fin d'une ligne dans la coquille; il est uniquement nécessaire lorsque vous êtes en mettre plusieurs commandes (ou des choses commedo
etthen
) sur la même ligne. De toute façon, voici mon petit réécriture:Pour moi, c'était grâce à
CRLF
. Il devrait êtreLF
pour linux env.Votre script peut être réduit à la simple: