web-dev-qa-db-fra.com

Création d'un fichier de sortie avec un script multiligne utilisant echo/linux

Essayer de créer un petit script capable d’écrire une partie du script dans le fichier de sortie sans aucune modification (tel quel)

texte du fichier source

echo "
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&
" >> output.txt

Sortie désirée:

yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&

Ce que je reçois, c'est: 

yellow=^[[33m
bel=^G
red=^[[31m
green=^[[32m
reset=^[(B^[[m
echo"#${green}Installing packages${reset}#" &&

Utilisation de CentOS 7 Minimal fresh install Vous recherchez une solution à appliquer au script/texte complet, sans modification de ligne à ligne, je suppose que vous pouvez également utiliser sed aussi.

6
Zaza

Vous devez échapper aux backticks (`):

#!/bin/bash
echo "
yellow=\`tput setaf 3\`
bel=\`tput bel\`
red=\`tput setaf 1\`
green=\`tput setaf 2\`
reset=\`tput sgr0\`
" >> output.txt

En bonus:

Je préfère utiliser cette méthode pour multiligne:

#!/bin/bash
cat << 'EOF' >> output.txt
yellow=$(tput setaf 3)
bel=$(tput bel)
red=$(tput setaf 1)
green=$(tput setaf 2)
reset=$(tput sgr0)
EOF
20
N1ckles

Utilisez un guillemet simple pour empêcher les extensions:

echo '
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
' >> output.txt

Pour plus de détails, voir Différence entre les guillemets doubles et simples .


Si votre texte inclut une citation simple, il est possible que ce qui précède ne fonctionne pas. Dans ce cas, utiliser un ici, doc serait plus sûr. Par exemple, ce qui précède va casser si vous insérez une ligne: var='something'

En utilisant un doc ici ce sera comme ceci:

cat >> output.txt <<'EOF'
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
var='something'
EOF
4
Jahid

Juste un ajout tardif: 

La commandeecho 'string' >> outputest simple et géniale. Mais cela peut vous donner l'erreur '...: Permission denied' combinée à Sudo.

J'ai récemment eu un petit problème avec Sudo echo 'string \n other string \n' > /path/to/file

Ce qui a fonctionné le mieux pour moi:
printf "Line1\nLine2\nLine3" | Sudo tee --append /path/to/file

Le fait que la chaîne soit également imprimée sur la sortie standard vous permet également de voir ce qui a été écrit dans le fichier.

0
Gergely M

Merci à Chepner

La meilleure solution que j'ai trouvée est:

echo '
yellow=$(tput setaf 3)
bel=$(tput bel)
red=$(tput setaf 1)
green=$(tput setaf 2)
reset=$(tput sgr0)
echo"#${green}Installing packages${reset}#"
' >> output

Avec cette solution, tout le texte va dans le fichier de sortie sans modifications et les définitions de couleurs fonctionnent aussi sans modifications.

0
Zaza