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
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.
ls
affichera la même chose quels -x
quand à un tty, et commels -1
quand non Par conséquent, utilisezls -x
pour obtenir ce que vous voulez.