sh: uvozovky v promenne
Jan Pechanec
jp at devnull.cz
Thu Aug 8 20:12:31 CEST 2013
On Thu, 8 Aug 2013, Miroslav Prýmek wrote:
>Takze verze, ktera bude splnovat vsechny tri priority (bezpecnost, korektni
>prikaz, korektni json),
>bude vypadat takhle:
>---------
>#!/bin/sh
>
>x=`echo $1 | sed 's/"/\\\"/g'`
lepsi je pouzit & jako nahradu za to, co se matchovalo, pak to
nemusis opisovat ani escapovat:
x=$( echo "$1" | sed 's/"/\\&/g' )
a pokud nedas $1 do uvozovek, tak se ti napriklad z ``a b'' stane
``a b'', coz ti nemusi vadit tady, ale jinde ano. Zpetky uvozoky jsou navic
obsolete, doporucuju misto toho konstrukci $( ... ).
>/usr/local/bin/curl -sS -i \
> -H 'Content-Type: application/json' \
> -d '{"neco":"'"$x"'"}' <adresa serveru>
>---------
>- prvne se vsechny uvozovky nahradi retezcem \"
>- pak se pomoci prolozeni uvozovek a apostrofu dosahne toho, ze urcite za
>"-d" bude nasledovat
>jeden parametr
>
>Je to tak?
neni :-)
pokud das do x neco s mezerou, treba ``a "b'' (tj. hodnota x
obsahuje 4 znaky), budes mit pomoci toho, co jsi napsal, za -d dva
parametry:
prvni: {"neco":"a
druhy: \"b"}
protoze specialni funkci vsech dvojitych uvozovek jsi potlacil dvemi
sadami jednoduchych uvozovek. Tobe ale v tomto pripade staci tohle:
-d "{\"neco\":\"$x\"}"
tim bude $x uvnitr dvojitych uvozovek v ramci jednoho parametru pro
-d. Promenne se expanduji uvnitr dvojitych uvozovek, ale ne uvnitr
jednoduchych. Mimochodem, nevim, jestli escape uvozovek, ktery delas tim
sedem, je ok v ramci HTTP, ale to je ted irelevantni. Pro stejny priklad,
``a "b'', tak budes mit pro -d jeden parametr (tj. cely retezec bude v
jednom prvku pole argumentu argv):
{"neco":"a \"b"}
fakt doporucuju si nekolikrat pozorne precist man k sh(1) a zkouset
si ruzny veci, nebo v tom budes mit porad hokej a budes tyhle veci (blbe)
resit metodou pokus/omyl. Nastudovanim sh(1) si usetris spoustu casu do
budoucna. Muzes mi verit, mam to z vlastni zkusenosti :-)
h.
--
Jan Pechanec <jp (at) devnull (dot) cz>
http://www.devnull.cz
More information about the Users-l
mailing list