L'interpolation des variables qui contiennent les '$' dans un script bash

Je suis en train d'écrire un script bash qui crée un compte d'utilisateur. Le nom d'utilisateur et le mot de passe de hachage sont tirés à partir d'un fichier basé sur certains critères. Le hachage de mot de passe contient naturellement '$' délimitant le hachage de champs (par exemple. $1${SEL}$...).

Le problème est que l'option-p pour useradd nécessite des guillemets simples autour du hachage de mot de passe afin d'empêcher le " $ " champs de interpolées comme des variables. Lors du passage d'une variable, dans le but de les interpoler, les citations doivent être le double. Les guillemets simples traiter la variable une chaîne de caractères.

Cependant, si je passe la variable dans les guillemets, la variable est élargi et chaque '$' est ensuite traitée comme si c'est une variable signification le mot de passe n'est jamais définie correctement. Ce qui est pire, c'est que certaines variables ont accolades'{' ou '}'), qui a en outre bungle les choses.

Comment puis-je passer une de ces valeurs et de s'assurer qu'il est interpolée complètement et sans modification par le shell?

Un exemple de la ligne de code spécifique avec toutes les variables interpolées intacte:

# Determine the customer we are dealing with by extracting the acryonym from the FQDN
CUSTACRO=$(${GREP} "HOST" ${NETCONF} | ${AWK} -F "." '{print $2}')
# Convert Customer acronym to all caps
UCUSTACRO=$(${ECHO} ${CUSTACRO} | ${TR} [:lower:] [:upper:])
# Pull the custadmin account and password string from the cust_admins.txt file
PASSSTRING=$(${GREP} ${CUSTACRO} ${SRCDIR}/cust_admins.txt)
# Split the $PASSSTRING into the custadmin and corresponding password
CUSTADMIN=$(${ECHO} ${PASSSTRING} | ${CUT} -d'=' -f1)
PASS=$(${ECHO} ${PASSSTRING} | ${CUT} -d'=' -f2)
# Create the custadmin account
${USERADD} -u 20000 -c "${UCUSTACRO} Delivery Admin" -p "${PASS}" -G custadmins ${CUSTADMIN}

EDIT: Plus de code pour plus de contexte.

Avez-vous essayé d'utiliser d'échappement? E. g. à l'aide de \ " ou \"
Vous pouvez tester ce qui se passe dans un script comme celui-ci en mettant set -x avant les commandes en question (et set +x par la suite). Ce sera la coquille d'impression a chaque commande avant de l'exécuter. Eh bien, en fait, il imprime une commande équivalente -- un qui aurais le même résultat net, mais peut avoir différentes (mais équivalent) en citant/échapper/etc. Cela peut vous donner une bien meilleure idée de ce qui se passe réellement (une fois que vous vous habituez à l'équivalence bits).

OriginalL'auteur theillien | 2013-11-05