Pourquoi mon script Bash renvoie-t-il une erreur de syntaxe?

J'écris un script qui boucle dans les files récents dans un dossier et exécute une command …

#!/bin/bash cd /home/Downloads recent_files = ($(ls -t | head -20)) for file in "${recent_files[@]}" do ./cmd $file done 

J'obtiens l'erreur de syntaxe suivante:

 line 3: syntax error near unexpected token `(' line 3: `recent_files = ($(\ls -t | head -20))' 

Le schéma d'affectation des variables Bash est var=value c'est-à-dire que les espaces supplémentaires ne sont pas autorisés.

Les supprimer affectera correctement ls -t | head -20 ls -t | head -20 sortie en tant que tableau.

Donc votre script devrait être:

 #!/bin/bash cd /home/Downloads recent_files=($(ls -t | head -20)) for file in "${recent_files[@]}" do ./cmd $file done 

Vous n'avez pas besoin de stocker la sortie dans une variable du tout:

 cd /home/Downloads command ls -t | head -20 | while read -r file; do ./cmd "$file" done 

ou même

 command ls -t | head -20 | xargs -L 1 ./cmd 

Une façon plus sûre de travailler c'est avec stat . Il ne vous protège toujours pas des noms de files avec des returns à la ligne, mais

 stat -c "%Y %n" * | sort -rn | head -20 | cut -d" " -f2- | xargs -L 1 ./cmd 

Pour être infaillible, find – probablement besoin d'outils GNU pour la gestion des null-byte

 find . "${find_options[@]}" -printf '%T@ %p\0' | sort -zrn | xargs -0 -L 1 sh -c './cmd "$(echo "$0" | sed "1s/^[0-9.]\\+ //")"' 

le tableau find_options peut être utilisé comme espace réservé pour append des directives de filtrage, telles que

 find_options=( -type f ) find_options+=( -maxdepth 1 ) find_options+=( -name '*.txt' ) 

etc

Vous devez supprimer les espaces autour du signe égal.

 recent_files=($(ls -t | head -20)) 

Alors ça devrait marcher.

Je pense qu'il y a une réponse plus simple …

 #! / bin / bash
 cd / home / Téléchargements
 pour le file dans $ (ls -t | head -20)
 faire
     ./cmd $ file
 terminé

Le message d'erreur dit tout. Cependant, pour aider à ces problèmes à l'avenir, vous pouvez adopter certaines pratiques:

  1. Commentez la ligne qui génère une erreur comme ceci:
  recent_files = ($ (ls -t | head -20)) 

et courir

  bash -n myScript.sh 

Cela permettra de vérifier les erreurs dans le script.

  1. Commenter un bloc de lignes comme ceci:

     : << 'EOF' lines of code EOF 

et courir

  bash -n myScript.sh 

En utilisant cette méthodologie, vous pourrez zoomer sur la ligne erronée de votre script.

Pour revenir à votre problème spécifique, beaucoup ont déjà répondu à ce qui en est la cause – les espaces autour du signe = .