web-dev-qa-db-fra.com

Comment utiliser des variables dans des chaînes entre guillemets?

Je me demande simplement comment faire écho à une variable entre guillemets simples (j'utilise des guillemets simples car la chaîne contient des guillemets).

     echo 'test text "here_is_some_test_text_$counter" "output"' >> ${FILE}

toute aide serait grandement appréciée

19
Pectus Excavatum

Les variables sont développées dans des chaînes entre guillemets, mais pas dans des chaînes entre guillemets simples:

 $ name=World

 $ echo "Hello $name"
 Hello World

 $ echo 'Hello $name'
 Hello $name

Si vous pouvez simplement changer de devis, faites-le.

Si vous préférez utiliser des guillemets simples pour éviter l'échappement supplémentaire, vous pouvez plutôt combiner et faire correspondre des guillemets dans le même argument:

 $ echo 'single quoted. '"Double quoted. "'Single quoted again.'
 single quoted. Double quoted. Single quoted again.

 $ echo '"$name" has the value '"$name"
 "$name" has the value World

Appliqué à votre cas:

 echo 'test text "here_is_some_test_text_'"$counter"'" "output"' >> "$FILE"
29

utiliser printf:

printf 'test text "here_is_some_test_text_%s" "output"\n' "$counter" >> ${FILE}
7
glenn jackman

Utilisez un heredoc:

cat << EOF >> ${FILE}
test text "here_is_some_test_text_$counter" "output"
EOF
4
William Pursell

La manière la plus lisible et fonctionnelle utilise des accolades entre guillemets.

'test text "here_is_some_test_text_'"${counter}"'" "output"' >> "${FILE}"
2
Paul Back

Affiche une variable entourée de guillemets simples:

printf "'"'Hello %s'"'" world
0
Elior Malul

Vous pouvez le faire de cette façon:

$ counter=1 eval echo `echo 'test text \
   "here_is_some_test_text_$counter" "output"' | \
   sed -s 's/\"/\\\\"/g'` > file

cat file
test text "here_is_some_test_text_1" "output"

Explication : La commande Eval traitera une chaîne en tant que commande. Ainsi, une fois le montant échappé correct, le résultat souhaité sera généré.

Il dit exécuter la chaîne suivante en tant que commande:

'echo test text \"here_is_some_test_text_$counter\" \"output\"'

Commande à nouveau en une ligne:

counter=1 eval echo `echo 'test text "here_is_some_test_text_$counter" "output"' | sed -s 's/\"/\\\\"/g'` > file
0
Kulimak Joco