echo variable avec le contenu de la substitution de commande

Jai écrit un script très basique de substitution de commande qui est ci-dessous:

#!/bin/bash files=$(ls *.fastq); echo $files 

Le répertoire contient un tas de fichiers .fastq et je veux juste utiliser la commande echo pour les afficher

Le script ci-dessus génère des fichiers fastq avec un espace entre chaque nom de fichier fastq.

Quand je lutilise de cette manière

#!/bin/bash files=$(ls *.fastq); echo "$files" 

, il imprime les résultats sur de nouvelles lignes.

Pourquoi est-ce ainsi? Est-ce quelque chose à voir avec la substitution de commandes?

Merci

Réponse

Lors du référencement dune variable, il Il est généralement conseillé de mettre son nom entre guillemets. Cela empêche la réinterprétation de tous les caractères spéciaux dans la chaîne entre guillemets – sauf $, ` (backquote) et \ (échapper). Garder $ comme caractère spécial entre guillemets doubles permet de référencer une variable entre guillemets (« $ variable »), cest-à-dire de remplacer la variable par sa valeur.

Utilisation guillemets doubles pour éviter la division des mots. Un argument entre guillemets se présente comme un seul mot, même sil contient des séparateurs despaces.

par exemple

variable1="a variable containing five words" COMMAND This is $variable1 # Executes COMMAND with 7 arguments: # "This" "is" "a" "variable" "containing" "five" "words" COMMAND "This is $variable1" # Executes COMMAND with 1 argument: # "This is a variable containing five words" 

Mettre les arguments dune instruction echo entre guillemets doubles nest nécessaire que lorsque le fractionnement de mots ou la préservation des espaces est un problème.

Pour plus dinformations et dexemples, allez ici

Answer

Vous avez des retours à la ligne car ls les met sur des lignes séparées. Les retours à la ligne disparaissent sans les guillemets car le shell (bash) transmet chaque texte séparé par des espaces sans guillemets à la commande en tant quargument distinct.

Remarque: La substitution de commande est effectuée par le shell, pas par ls , vous navez donc pas besoin de ls.

Par conséquent, vous pouvez faire

#!/bin/bash echo *.fastq 

ou

#!/bin/bash files="*.fastq" echo "$files" 

Commentaires

  • exécution de ls * .fastq sur les sorties du terminal sur la même ligne séparée par des espaces, comment les met-on alors sur des lignes séparées?
  • Je ne trouve pas les documents, mais ls affichera la même chose que ls -x quand à un tty, et comme ls -1 quand non Par conséquent, utilisez ls -x pour obtenir ce que vous voulez.

Réponse

Lorsque vous faites référence à une variable sans guillemets autour delle (par exemple echo $files), le shell divise la valeur en espace et transmet chaque terme comme une option de ligne de commande distincte. Les retours à la ligne sont traités de la même manière que tout autre espace blanc. Le programme echo ne voit pas du tout les caractères de nouvelle ligne; il obtient juste un tableau de chaînes, dont chacune est un seul nom de fichier.

Quand vous faites référence à une variable entre guillemets (par exemple echo "$files"), le shell neffectue aucune division despaces; au lieu de cela, il transmet la valeur entière, non modifiée, sous forme dargument unique . Le programme echo reçoit une longue chaîne qui inclut les caractères de nouvelle ligne.

Variables mises à part, cest le même comportement que vous obtenez avec des guillemets autour des valeurs littérales. Si vous écrivez echo foo bar, les espaces sont supprimés par le shell et echo ne récupère que les chaînes foo et bar, et il « affichera ces chaînes avec un seul espace entre elles, car cest comme ça » est codé pour combiner plusieurs arguments. Si vous écrivez echo "foo bar", echo obtient la chaîne unique foo bar et limprimera telle quelle.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *