J'essaye de lancer une for
boucle pour le fichier et je veux afficher la ligne entière. Mais au lieu de cela, il n’affiche que le dernier mot. Je veux la ligne complète.
for j in `cat ./file_wget_med`
do
echo $j
done
résultat après exécution:
Found.
Voici mes données:
$ cat file_wget_med
2013-09-11 14:27:03 ERROR 404: Not Found.
command-line
bash
scripts
utilisateur192118
la source
la source
Réponses:
for
La boucle se scinde lorsqu'elle voit des espaces tels que des espaces, des tabulations ou des nouvelles lignes. Donc, vous devriez utiliser IFS (Internal Field Separator) :la source
unset IFS
après, afin que les autres commandes ne soient pas influencées par ce même shell.$
signifieIFS=$'\n'
?$
fait que les sauts de ligne fonctionnent à l'intérieur de la chaîne. Cela devrait également être fait à l'local IFS=$'\n'
intérieur d'une fonction.$'...'
connu " ANSI-Cfor
les boucles divisées sur tous les espaces (espace, tabulation, nouvelle ligne) par défaut; Le moyen le plus simple de travailler sur une ligne à la fois est d'utiliser unewhile read
boucle, qui se divise en nouvelles lignes:Je m'attendrais à ce que votre commande crache un mot par ligne (c'est ce qui s'est passé lorsque je l'ai testé avec mon propre fichier). Si quelque chose d'autre se passe, je ne suis pas sûr de ce qui pourrait en être la cause.
la source
for i in `ls`; do echo $1; done
, par redirigeant la sortie vers la commande while:ls|while read i; do echo $i; done
. Cela fonctionne sur les noms de fichiers / dossiers avec des espaces, sans qu'il soit nécessaire de modifier les variables d'environnement. Très bonne réponse.ls
n'est pas considéré comme sûr à utiliser avec|
(l'opérateur de canalisation).find
est plus flexible en plus d’être plus sûr à cet effet.pbpaste | while read t; do echo "<string>$t</string>"; done
ls -1
peut être utilisé avec|
pour garantir une sortie non formatée par ligneVérifié le travail, pas la ligne que vous voulez probablement mais il est impossible de faire si élégamment.
la source
Voici une légère extension de la réponse de Mitchell Currie, que j'aime bien à cause du petit nombre d'effets secondaires, ce qui évite de devoir définir une variable:
la source
-name '*'
et ce serait la même chose, non?Je l'écrirais comme ceci:
car cela nécessite le moins de changements dans le script d'origine (à l'exception de la solution utilisant
IFS
, mais il modifie lebash
comportement non seulement pour cette instruction de contrôle de boucle).la source
cat
sont inutiles ici.while
boucle accepte très bien la redirection, raison pour laquelle ceci est généralement écritwhile IFS= read -r line; do...done < input.txt
Mapfile est un moyen pratique de lire les lignes d'un fichier dans un tableau indexé, pas aussi portable que lu mais légèrement plus rapide. En utilisant la boucle for, vous évitez de créer un sous-shell.
Gardez à l'esprit lorsque vous utilisez des pipelines, cela mettra la boucle while dans un sous-shell. Les modifications à l'intérieur de la boucle while, comme les variables, ne se propagent pas à la partie externe du script.
Exemple:
(Meilleure solution):
la source
Dandalf s’est vraiment approché d’une solution fonctionnelle, mais il ne faut JAMAIS essayer d’attribuer le résultat de quantités d’entrées inconnues (c.
find ~/.gdfuse -name '*'
-à- d. ) À des variables! Ou, du moins, essayez de faire une telle chose via une variable tableau; si vous insistez pour être aussi paresseux! Alors, voici la solution de Dandalf faite sans la manœuvre dangereuse; et en une seule lignela source