GNU/Linux >> Tutoriels Linux >  >> Linux

Transformation automatique des nouvelles lignes dans l'affectation de variables Shell ?

Cela est sorti d'un de mes commentaires à cette question concernant l'utilisation de bc dans les scripts shell. bc met les sauts de ligne en grand nombre, par exemple :

> num=$(echo 6^6^3 | bc)
> echo $num
12041208676482351082020900568572834033367326934574532243581212211450\ 20555710636789704085475234591191603986789604949502079328192358826561\ 895781636115334656050057189523456

Mais notez qu'ils ne sont pas vraiment des sauts de ligne dans la variable - ou du moins il n'y en a pas si elle est utilisée sans guillemets. Par exemple, en jouant avec plus de pipe dans le devoir, par exemple :

num=$(echo 6^6^3 | bc | perl -pne 's/\\\n//g')

J'ai réalisé que bien qu'il y ait vraiment un \n dans le bc sortie, vérification de echo $num > tmp.txt avec hexdump affiche le \n (ASCII 10) est définitivement devenu un espace (ASCII 32) dans l'affectation des variables.

Ou du moins, dans la sortie de $num > sans guillemets . Pourquoi est-ce ?

Comme le souligne fedorqui, si vous utilisez des guillemets :echo "$num" , vous obtenez à nouveau des retours à la ligne. Cela est évident en examinant la différence entre echo $num > tmp.1 et echo "$num" > tmp.2 avec vidage hexadécimal ; le premier contient \ (espace antislash) alors que ce dernier contient \\n (retour à la ligne).

Réponse acceptée :

echo met un espace entre chacun des deux arguments. Le shell considère la nouvelle ligne dans $num juste un séparateur de mots (comme un espace).

lines="a
b
c"
set -x
echo $lines   # several arguments to echo
echo "$lines" # one argument to echo

Voir cette réponse (par le PO lui-même) pour une explication plus détaillée.


Linux
  1. Linux bash :affectation de plusieurs variables

  2. Modifier le script shell pendant son exécution

  3. Shell - Écrire le contenu d'une variable dans un fichier

  4. Toutes les nouvelles lignes sont supprimées lors de l'enregistrement de la sortie cat dans une variable

  5. Portée variable pour les scripts shell bash et les fonctions dans le script

Comportement inattendu d'un script shell ?

Priorité des opérateurs logiques Shell &&, ||?

Explication de la commande d'exportation sous Linux

Qu'est-ce que le sous-shell sous Linux ?

linux shell wc -c compte les caractères +1

Shell =Vérifier si la variable commence par #