Echo d'une commande echo avec une variable dans bash
Ok, là je suis aux prises avec que nous parlons. Faisant écho à une commande echo avec une variable.
echo "creating new script file."
echo "#!/bin/bash" > $servsfile
echo "read -p "Please enter a service: " ser " >> $servfile
echo "servicetest=`getsebool -a | grep ${ser}` " >> $servfile
echo "if [ $servicetest > /dev/null ];then " >> $servfile
echo "echo "we are now going to work with ${ser}" " >> $servfile
echo "else" >> $servfile
echo "exit 1" >> $servfile
echo "fi" >> $servfile
Mon but est de créer un script à l'aide de l'écho de commandes, puis l'exécuter plus tard. J'ai juste besoin de comprendre comment l'echo echo/les commandes de lecture tout en conservant mes variables.
edit: les variables ont besoin de transférer ce qui est à l'intérieur d'eux dans le nouveau fichier.
source d'informationauteur David
Vous devez vous connecter pour publier un commentaire.
Échapper à tous " à l'intérieur des guillemets avec \. Le faire avec des variables comme \$servicetest trop:
Le problème immédiat est que vous avez est avec le cite: en utilisant les guillemets, vos références à des variables sont instantanément élargiqui n'est probablement pas ce que vous voulez.
Utilisation unique citations au lieu - chaînes de caractères à l'intérieur des guillemets simples ne sont pas développés ou interprétés par le shell.
(Si vous voulez sélective expansion à l'intérieur d'une chaîne, c'est à dire, de développer certaines références à des variables, mais pas à d'autres - n'utiliser des guillemets, mais préfixe de la
$
de références que vous ne pas voulez élargi avec\
; par exemple,\$var
).Cependant, il est préférable d'utiliser un seul ici-doc[ument]qui vous permet de créer des multi-ligne
stdin
d'entrée sur le spotencadré par deux instances de l'auto-choisi délimiteurl'ouverture d'un préfixe<<
et le cours de clôture sur une ligne par lui-même - à partir de la première colonne; la recherche pourHere Documents
dansman bash
ou à http://www.gnu.org/software/bash/manual/html_node/Redirections.html.Si vous devis l'ici-doc délimiteur (
EOF
dans le code ci-dessous), les références à des variables sont également pas élargi. @Chepner souligne dans un commentaire, vous êtes libre de choisir la méthode de citer dans ce cas: placer le séparateur entre guillemets simples ou guillemets, ou même simplement arbitrairement échapper un caractère délimiteur avec\
:@Bruce K notes dans un commentaire, vous pouvez préfixe votre ici-doc délimiteur avec
-
(appliqué à cet exemple:<<-"EOF"
) afin de ont des onglets dépouilléce qui permet pour l'indentation qui rend le contenu réel de l'ici-doc plus facile à discerner.Notez, cependant, que cela ne fonctionne qu'avec les réels onglet caractères, sans espaces.
Employant cette technique, combinée avec les après-coups qui concerne le script du contenu ci-dessous, on a (encore une fois, notez que le nombre réel de onglet caractères. doit être utilisé à la tête de chaque ici-doc contenu en ligne pour eux de se dépouillés):
Enfin, notons que dans
bash
même normale d'un simple ou double chaînes entre guillemets peuvent s'étendre sur plusieurs lignesmais vous ne pouvez pas obtenir les avantages de l'onglet de décapage ou de la ligne-bloc de portée, comme tout à l'intérieur des citations devient une partie de la chaîne.Ainsi, remarque comment, dans la suite de
#!/bin/bash
a qu'à suivre l'ouverture'
immédiatement afin de devenir la première ligne de la sortie:Après-coups qui concerne le contenu de votre script:
$(...)
est préféré au`...`
pour la substitution de commande de nos jours.${ser}
dans legrep
de commande, la commande sera susceptible de se briser si la valeur contient des espaces (sinon, assurez-vous que la valeur de lecture ne contient pas d'espaces ou d'autres shell métacaractères).[[ -n $servicetest ]]
pour tester si$servicetest
est vide (ou d'effectuer la substitution de commande directement à l'intérieur du conditionnel) -[[ ... ]]
- la forme préférée dansbash
- protège de vous casser le conditionnel si le$servicetest
arrive à avoir des espaces; il n'y a pas besoin de supprimer stdout à l'intérieur d'un conditionnel (si[ ... ]
ou[[ ... ]]
pas de stdout est passé à travers, donc, la> /dev/null
est redondante (cela dit, avec une commande de substitution à l'intérieur d'un conditionnel, stderr de sortie EST passé au travers).Vous avez juste besoin d'utiliser les guillemets simples:
À l'intérieur des guillemets simples caractères spéciaux ne sont pas spéciaux, ils sont juste des personnages.