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