1
votes

Commande multiligne Bash avec entrée | production

Ma question est simple. Je cherche simplement à formater mon code bash en quelque chose d'un peu plus lisible pour les autres utilisateurs. Bien que cela fonctionne:

long_arg="my very long string\
 which does not fit\
 on the screen"

Je ne comprends pas pourquoi la barre oblique inverse ne fonctionne pas avec une instruction input output séparée par | .. IE

mysql --login-path=main-data -N -e "SELECT section_id\
FROM db.table\
WHERE contractor_id = '1'" | while read contractor_info_id; do

#......//

done

Il génère une erreur fatale Erreur de syntaxe: "done" inattendu

Pourquoi le formatage multiligne fonctionne-t-il sur une seule commande sortie telle que:

mysql --login-path=main-data -N -e "SELECT section_id FROM db.table WHERE contractor_id = '1'" | while read contractor_info_id; do

#......//

done

Mais pas sur une commande output | input ?


3 commentaires

Ce n'est pas nécessaire entre les guillemets.


Dans votre exemple SQL, la barre oblique inverse supprime le saut de ligne, ce qui signifie que la commande SQL est SELECT section_idFROM db.tableWHERE Contractors_id = '1' . Il n'y a pas d'espaces sur tous . Votre long_arg a un espace blanc au début des lignes suivantes pour séparer les mots.


@glennjackman Désolé pour le peu clair "ne fonctionne pas" - Ce que je voulais dire par là, c'est que cela génère une erreur: Erreur de syntaxe: "done" inattendu - Ce que j'ai l'intention de comprendre, c'est comment pour avoir ce format multiligne dans l'instruction SQL sans générer d'erreur.


4 Réponses :


1
votes

Les barres obliques inverses ne sont pas nécessaires entre les guillemets, et SQL n'est généralement pas pointilleux sur les espaces blancs supplémentaires de toute façon.

Je n'ai pas installé mysql ici, mais essayez ceci et faites-moi savoir s'il ne se comporte pas ...

mysql --login-path=main-data -N -e "
  SELECT section_id
    FROM db.table
   WHERE contractor_id = '1'
" | while read contractor_info_id
    do echo $contractor_info_id
    done


2 commentaires

C'est ce que j'ai essayé pour la première fois - Si vous faites simplement ceci .. Les erreurs de script bash bash sortent Erreur de syntaxe: "done" inattendu


vous devez mettre une sorte d'instruction exécutable dans la boucle. ;)



1
votes

La raison pour laquelle la fin de ligne échappée ne fonctionne pas dans votre cas d'utilisation mysql est que mysql ne nécessite pas de fin de ligne échappée. Le texte entre les deux guillemets doubles est traité comme la chaîne et les caractères d'échappement ne sont pas interprétés. (par exemple: \ t ne mettrait pas dans un onglet). Vous pouvez le voir en action avec ces exemples:

$ echo "Hello from line one
> and hello from line two"
Hello from line one
and hello from line two
$ echo Hello from line one \
> and also from line one
Hello from line one and also from line one

TL; DR: entre guillemets doubles, la barre oblique et CR sont traités comme faisant partie de la chaîne, et non interprétés comme un caractère d'échappement.


1 commentaires

Mais si je déséchappe la barre oblique inversée , elle s’erreur avec la même erreur que celle qui a été échappée: Erreur de syntaxe: "done" inattendu - Comment faire correctement mon SQL instruction multiligne sans générer l'erreur?



0
votes

La raison pour laquelle cela m'est arrivé était un problème unique que j'avais avec mon IDE. C'était l'insertion d'un caractère réel pour un saut de ligne plutôt que simplement un saut de ligne physique lui-même. Le problème n'était pas la syntaxe que j'essayais, mais plutôt les caractères insérés lors de l'enregistrement. Merci à tous ceux qui ont réfléchi à ma question. Ma syntaxe d'origine sans échappement était correcte au départ.


2 commentaires

Il semble que votre IDE utilise des fins de ligne \ r \ n . Cela mettrait un retour chariot après la barre oblique inverse. Vous devriez pouvoir contrôler ce comportement dans votre IDE.


c'est exactement ce qui se passait. Le paramètre EOL a été défini sur \ r \ n



1
votes
"SELECT section_id
FROM db.table
WHERE contractor_id = '1'"

0 commentaires