Bash: quoted parameters voor een function

Pagina: 1
Acties:

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Hoihoi

Ik ben momenteel met BASH wat scriptjes aan het schrijven om een psql DB te benaderen.
Hiervoor heb ik een functie queryDB, die zijn parameter (een SQL statement) naar de DB stuurt en het resultaat teruggeeft na wat head en tail werk.
code:
1
queryDB 'SELECT "LineName" FROM "Line" limit 10;'

Een willekeurig (heel lastig ;)) statement.

Mijn functie:
code:
1
2
3
4
5
6
7
8
9
10
function queryDB ()
{
        QUERY=$1
        print $1
        RESULT=echo $QUERY  | psql -U $USERNAME $DBNAME

       # Hier komt wat bewerking....

       return $RESULT
}


Echter krijg ik het niet goed qua quotes als ik die functie wil gebruiken. De query an sich is trouwens prima, die werkt gewoon.


Als ik de query single-quote, dan krijg ik dit als output:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
boudewijn@fiberdb:~$ sh plaintextFiberDump.sh
Warning: unknown mime-type for "SELECT" -- using "application/octet-stream"
Warning: unknown mime-type for ""LineName"" -- using "application/octet-stream"
Warning: unknown mime-type for "FROM" -- using "application/octet-stream"
Warning: unknown mime-type for ""Line"" -- using "application/octet-stream"
Warning: unknown mime-type for "limit" -- using "application/octet-stream"
Warning: unknown mime-type for "10;" -- using "application/octet-stream"
Error: no such file "SELECT"
Error: no such file ""LineName""
Error: no such file "FROM"
Error: no such file ""Line""
Error: no such file "limit"
Error: no such file "10;"

Double-quoten werkt ook niet.


On the other hand, dit werkt wel:
code:
1
        LINE_INFO= echo 'SELECT "LineName" from "Line" where "LineName"=$LINENAME ;' | psql -U $USERNAME $DBNAME
Een single quote zou dus prima moeten zijn, waardoor ik concludeer dat het probleem zit rond het als parameter meesturen van die query.

Kan iemand me vertellen wat ik fout doe? Uiteraard heb ik al RTFM gedaan (niet goed genoeg dus!), en trial-and-error.

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Je moet of double-quoten ("'blah'", "\"blah\"") of de $QUERY binnen je functie in quotes zetten. Als je een functie zo aanroept:

code:
1
functie "blah"


krijgt je functie niet "blah" (met quotes) binnen maar gewoon blah. Dat maakt in je voorbeeld met echo niet veel uit maar gegarandeerd dat je daar problemen mee krijgt.


Verder is 'print' niet wat je zoekt...

[ Voor 45% gewijzigd door CyBeR op 18-05-2009 02:42 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Tips:
• met double quotes kan je variabelen ($) mixen in je string. double quotes in double quotes escape je met een backslash A="a\"b"; variabele $A is nu a"b.
• "print" doet niet wat je denkt dat het doet
• resultaten in een variabele stoppen doe je met o.a. met de backtick operator: A=`ls`; $A is bevat nu de output van ls.
Succes!

[ Voor 1% gewijzigd door Erik Jan op 18-05-2009 02:40 . Reden: te laat :) ]

This can no longer be ignored.


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Aaah shit ja.
Print, wat dom :X


* Boudewijn heeft teveel met andere talen zitten te prutsoren.
bedankt voor de tips :).


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
function queryDB ()
{
        QUERY="$1"
        RESULT=`echo "$QUERY"  | psql -U $USERNAME $DBNAME`

        LINECOUNT=`echo $RESULT | wc -l`
        echo $RESULT
        echo $LINECOUNT

        #return $RESULT
}

queryDB 'SELECT "LineName" FROM "Line" limit 10;'


Het doet bijna wat ik wil :).

Probleem is echter dat momenteel de hele output op 1 regel wordt geplempt. Alle spaces vervangen door newlines is geen goed plan (er kunnen spaces in mijn resultaat zitten), dit gebeurt door het back-ticken.

Is daar ook een handige truc voor?


offtopic:
Dit projectje wordt echt goed voor mijn postcount :P

offtopic:
En ja ik wil straks wat nuttigs met die linecount doen, er zitten wat psql headers om de output heen


edit: RESULT=$(echo "$QUERY" | psql -U $USERNAME $DBNAME) doet het ook niet multiline.
edit2: Ik kan op zich wel wat met een psql parameter met output separation doen, maar dat is imo een workaround.

[ Voor 86% gewijzigd door Boudewijn op 18-05-2009 03:06 ]


  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

de newlines zitten wel in je resultaat, echter ziet de shell dat als whitespace om argumenten te scheiden, en roep je nu echo aan met meerdere argumenten:
code:
1
2
3
echo a            b   -> a b
verschilt van
echo "a          b"  -> a        b

This can no longer be ignored.


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Je hebt helemaal gelijk :).

Stom zeg dat ik zo aan het prutsen ben :/.

  • laurencevde
  • Registratie: November 2001
  • Laatst online: 02-10-2025
Tijd om de bash-manpage te gaan lezen? En dan vooral het deel over expansion en word splitting?

print is geen standaard commando. Niet om uitvoer te tonen iig... Gebruik daar echo voor.

RESULT=echo $QUERY | psql -U $USERNAME $DBNAME moet worden:
RESULT="$(echo "$QUERY" | psql -U $USERNAME $DBNAME)"

Query wordt anders niet uitgevoerd...

Verder even overal in je functie elk gebruik van elke variabele tussen dubbele quotes zetten, anders wordt het resultaat in losse woorden opgesplitst, en *-tjes e.d. voor bestandsnamen vervangen...

Je kunt de meeste quotes weglaten als je IFS op iets veiligs zet(interne word-splitting, liever geen spatie, dus bijv. IFS=$'\x09'$'\x0A'$'\x0D' ,tab, newline, CR), en je ergens set -f (geen padnaam-expansie) uitvoert.

Have a taste of freedom. It is sometimes a bitter pill. To me though, this is the sweetness of the GPL

Pagina: 1