Erreur de ligne dans le script shell
-
21-08-2019 - |
Question
Je le code suivant dans un script shell. Cela semble ne fonctionner que quand il est pas défini dans une fonction. La ligne problématique est celui qui contient le « << ». Le message d'erreur est
» ./ run: ligne 210: erreur de syntaxe: fin de fichier inattendue "
Comment puis-je écrire cela correctement dans une fonction?
init_database()
{
cd ../cfg
db.sh << ENDC
$DB_ADMIN
0
y
n
ENDC
check_status
sqlplus $DB_SCHEMA@$DB_NAME < initial_data.sql
cd -
}
La solution
Il y a un certain nombre de façons de résoudre ce problème.
1 / Désindenter le marqueur de fin du document ici, par exemple:
cat <<EOF
hello
$PWD
EOF
mais fera de votre code laid.
2 / "indent" le document ici marqueur de début:
cat <<' EOF'
hello
$PWD
EOF
où que peu avant le premier EOF est exactement le même que celui avant la seconde (tab, quatre espaces, deux pattes, que ce soit). Cela vous permet de garder votre belle indentation, même si elle ne se développe pas ici variables dans le document-(ne change pas $PWD
).
3 / Autoriser les languettes à décaper à partir du début de lignes d'entrée et le marqueur de fin.
cat <<-EOF
hello
$PWD
EOF
mais il n'y a aucun moyen de pattes dans les débuts de lignes.
4 / Pour vos besoins, vous pouvez également utiliser:
( echo "$DB_ADMIN";
echo "" ;
echo "0" ;
echo "y" ;
echo "n"
) | db.sh
check_status
sqlplus $DB_SCHEMA@$DB_NAME < initial_data.sql
cd -
Je crois que le numéro 4 est la meilleure option pour vous. Il permet jusqu'à belle doublure des entrées, des onglets et des espaces partout dans les lignes et l'expansion variable.
Autres conseils
La fin de « document en » doit être sans retrait, je le crains.
L'étiquette doit être seul ENDC
en ligne sans entraîner / whitspaces arrière.