Bash: différence entre le chat et l'echo
C'est file.txt
:
foo:bar:baz:qux:quux
one:two:tree:four:five:six:seven
alpha:beta:gamma:delta:epsilon:zeta:eta:teta:iota:kappa:lambda:mu
the quick brown fox jumps over the lazy dog
C'est ce que j'ai essayé dans le terminal:
user@notebook:~/Desktop$ cat file.txt
foo:bar:baz:qux:quux
one:two:tree:four:five:six:seven
alpha:beta:gamma:delta:epsilon:zeta:eta:teta:iota:kappa:lambda:mu
the quick brown fox jumps over the lazy dogmuser@notebook:~/Desktop$ cat read.sh
while read -r line
do
echo $line
done < file.txt
user@notebook:~/Desktop$ ./read.sh
foo:bar:baz:qux:quux
one:two:tree:four:five:six:seven
alpha:beta:gamma:delta:epsilon:zeta:eta:teta:iota:kappa:lambda:mu
Ma question est: pourquoi ne pas read.sh
montrer la dernière fin de ligne comme cat file.txt
n'?
Vous devez vous connecter pour publier un commentaire.
Car il n'y a pas de fin de ligne file.txt si vous:
Il n'y a pas
\n
à la fin du fichier.echo
un autre côté les autres pourront toujours ajouter une nouvelle ligne lorsque vous l'écho d'un message si il n'en est pas une.wc -l
est un bon moyen de confirmer cela. Donc, estod -ta
, pour montrer où les caractères de saut de ligne sont présents.od -c
est un bon moyen pour vérifier si il y a un \n - merci pour l'astuce.D'autres réponses sont justes, il n'y a tout simplement pas de caractère de saut de ligne à la fin de votre
file.txt
.La plupart des éditeurs de texte sera la fin d'un fichier avec un retour à la ligne automatique, même
nano
le fait. Mais votre fichier a été généré par un script, droit?Pour reproduire ce problème, tout ce que vous avez à faire est de:
-n
drapeau raconte pas d'écho à la sortie de la fuite de saut de ligne.Aussi, si vous voulez que votre
read
code fonctionne, vous pouvez utiliser ceci:C'est d'aller travailler parce qu'en fait,
read
aura lieu la dernière ligne dans la variable, mais il sera également de retour faux, brisant ainsi la boucle while.Votre
file.txt
ne contient pas de saut de ligne à la fin de la dernière ligne. Donccat
ne pas le montrer.Noter que
read.sh
ne pas afficher la dernière ligne à tous les... dansread.sh
,read
est en attente pour une ligne complète de l'entrée, et depuis la dernière ligne n'est pas terminée par un retour à la ligne, de sorte qu'il n'est pas lue.Votre fichier d'entrée n'est pas dans un retour à la ligne.
cat file
copie simplement le contenu du fichier sur la sortie standard. Il fonctionne par des personnages, pas de lignes, de sorte qu'il ne se soucie pas si le fichier se termine par un retour à la ligne ou pas. Mais si elle ne se termine pas dans un retour à la ligne, il ne sera pas en ajouter un à la sortie.read -r line
va lire une ligne dans la variable. Il ne fait état de la réussite si la ligne se termine par un saut de ligne. Si la dernière ligne de l'entrée n'a pas de fin en ligne, il signale une erreur, comme si EOF avait été atteint. Donc la boucle s'arrête quand il essaie de lire la dernière ligne, au lieu de renvoyer cette ligne. C'est pourquoi le script n'affiche jamais le début de ligne avecthe quick brown fox
.En général, Unix fichier texte les programmes ne sont définies que pour travailler sur des fichiers texte qui en fin de saut de ligne. Leur traitement de la dernière ligne si elle n'a pas un caractère de saut de ligne n'est généralement spécifiée.
read
retourné une erreur, donc je ne savais pas la distinction. J'ai mis à jour ma réponse.