Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: webhope 05. 04. 2010, 17:08:05

Název: Jak dostat do grepu argument z proměnné?
Přispěvatel: webhope 05. 04. 2010, 17:08:05
Jak dostat do grepu argument z proměnné?

Původně jsem měl tento kod mimo funkci a fungoval:
Kód: [Vybrat]
d=" -e linux "
subdirs=$(find $main_dir -maxdepth 1 | grep -i  $d | sort --stable -k "1");
Nyní po přesunutí do funkce nefunguje. Proměnná je předána jako řetězec ne jako argument.

Toto taky nefunguje:
Kód: [Vybrat]
d=" -e linux "
subdirs=$(find $main_dir -maxdepth 1 | `grep -i  $d` | sort --stable -k "1");
Název: Re: Jak dostat do grepu argument z proměnné?
Přispěvatel: Pakánek 05. 04. 2010, 17:57:04
Zkus:
Kód: [Vybrat]
grep '$PROM' souborviz. http://tldp.org/LDP/abs/html/quoting.html (http://tldp.org/LDP/abs/html/quoting.html)
Název: Re: Jak dostat do grepu argument z proměnné?
Přispěvatel: webhope 05. 04. 2010, 18:49:34
Tohle nepomáhá
Kód: [Vybrat]
find $main_dir -maxdepth 1 | grep -i  '$d'
Název: Re: Jak dostat do grepu argument z proměnné?
Přispěvatel: ego 05. 04. 2010, 21:08:00
v apostrofech se neprovadi expanze promennych, takze
grep -i '$d'
bude hledat neco jako d za koncem radky, coz se obeavam, ze nenajde nikdy nic :).  Naopak
grep -i "$d"
bude fungovat podle ocekavani (v uvozovkach se promenne expanduji).
Název: Re: Jak dostat do grepu argument z proměnné?
Přispěvatel: webhope 05. 04. 2010, 21:22:44
Ego

Takže v  ''  se vyhodnocují regulární výrazy? Když říkáš že dolar se interpretuje jako konec řádky

No normální uvozovky jsem použil právě mimo funkci a to fungovalo. Ale uvnitř funkce to nefunguje. V promenne d je parametr "-e linux" nebo něco podobneho.
Název: Re: Jak dostat do grepu argument z proměnné?
Přispěvatel: ego 05. 04. 2010, 22:05:00
Teprve ted jsem si vsimnul, ze chces pres promennou d na cmdline grepu predat vic nez jeden parametr.  Pak pouzij
grep -i $d
(ale to -e je tam zpravidla zbytecne, viz. man grep)
Nelze rict, ze v uvozovkach se vyhodnocuji regularni vyrazy, to je nonsens.  grep vyhledava reg. vyraz, ktery dostane na cmdline.  At pouzijes uvozovky nebo apostrof, nic z toho nikdy grep neuvidi--"spolkne" to shell, jen to ridi, co shell grepu na cmdline preda.  A zjednodusene receno to v apostrofech mu preda 1:1 (beze zmeny), kdezto na tom v uvozovkach predtim provede mj. expanzi promennych.  Dulezite ale je uvedomit si, ze pokud udelas
grep -i "$d"
tak i kdyz promenna d bude obsahovat vice slov, grep pak techto vice slov dostane jako jeden parametr (a v tomto pripade to pochopi jako search pattern).  Proto, kdyz chces predat promennou obsahuji "-e linux" a chces, aby to grep dostal jako dva parametry, nesmis uvozovky pouzit vubec.
Název: Re: Jak dostat do grepu argument z proměnné?
Přispěvatel: webhope 05. 04. 2010, 22:17:37
Jenže při nastavování proměnné uvozovky použít musím. Proměnná může obsahovat více e parametrů.

Kód: [Vybrat]
d=" -e linux -e ext -e ext"
Do toho grepu to předávám už bez uvozovek, ale shell to grepu předává jak kdyby tam byly jednoduché uvozovky.

Kód příspěvku #1 vypisuje toto:
Kód: [Vybrat]
+++ find /sata -maxdepth 1
+++ grep ' -e xp -e win ' -i
+++ sort --stable -k 1
++ subdirs=

všimni si že řádek #2 to obdržel je v jednoduchych uvozovkach.
Název: Re: Jak dostat do grepu argument z proměnné?
Přispěvatel: ego 05. 04. 2010, 23:16:19
Kód: [Vybrat]
+++ grep ' -e xp -e win ' -i
Apostrofy v tomto vypisu vyjadruji jen to, ze to grep obdrzel jako jeden parametr, ale ver mi, obdrzel to bez apostrofu! :)

Mimochodem, v tomto vypisu je podezrele uz to, ze to co obdrzel grep, zacina mezerou, takze nejspis TO CELE (vcetne prvni a posledni mezery) pochopil jako pattern (protoze to nezacina pomlckou, to -e bere jako soucast pattern, coz asi nechces).

Rad pomuzu to doresit :), zkus to cele kdyztak prosim zredukovat na co nejmensi zdrojak, ktery nedela co by sis predstavoval, tj. vyhod z toho co tam nemusi byt (find, sort, ...), tak se to bude zkoumat nejlepe.
Název: Re: Jak dostat do grepu argument z proměnné?
Přispěvatel: webhope 05. 04. 2010, 23:33:29
Kód: [Vybrat]
function get_device {
d="-e xp -e win";
set -x
subdirs=$(find $main_dir -maxdepth 1 | grep $d -i | sort --stable -k "1");
echo $subdirs
}

get_device

Výsledek:
Kód: [Vybrat]
+++ find /sata -maxdepth 1
+++ grep '-e xp -e win' -i
+++ sort --stable -k 1
++ subdirs=
++ echo

ZJEDNODUŠENY KOD:
Kód: [Vybrat]
function get_device {
d="-e xp -e win";
set -x
find /mnt -maxdepth 1 | grep $d -i
}

get_device

Ten zjednodušený kód ale v shellu háže divný výstup na posledním řádku:

Kód: [Vybrat]
# function get_device {
> d="-e xp -e win";
> set -x
> find /mnt -maxdepth 1 | grep $d -i
> }
#
# get_device
+ grep --color -e xp -e win -i
+ find /mnt -maxdepth 1
++ echo -ne '\033]0;admin@localhost:/'

Název: Re: Jak dostat do grepu argument z proměnné?
Přispěvatel: deadmail 06. 04. 2010, 00:01:08
Kód: [Vybrat]
function get_device {
d="-e xp -e win";
set -x
      subdirs=$(find $main_dir -maxdepth 1 | grep $d -i | sort --stable -k "1");
echo $subdirs
}

get_device

Výsledek:
Kód: [Vybrat]
+++ find /sata -maxdepth 1
+++ grep '-e xp -e win' -i
+++ sort --stable -k 1
++ subdirs=
++ echo

ZJEDNODUŠENY KOD:
Kód: [Vybrat]
function get_device {
d="-e xp -e win";
set -x
      subdirs=$(find /mnt -maxdepth 1 | grep $d -i );
echo $subdirs
}

get_device

Fakt mi to rozum nebere



No u mna (GNU bash 3.2.39) to apostrofy nevypisuje ...

Kód: [Vybrat]
+ get_device
+ d='-e xp -e win'
+ set -x
++ grep -e xp -e win -i
++ find /mnt -maxdepth 1
+ subdirs=
+ echo

Cez regularny vyraz sa to da lahko obist:
Kód: [Vybrat]
d="xp|win"
find ... | egrep -i "$d" | sort --stable
Prepinac -k 1 je defaultne nastavenie sortu (tried podla celeho riadku), teda sa nemusi zapisovat
Název: Re: Jak dostat do grepu argument z proměnné?
Přispěvatel: webhope 06. 04. 2010, 00:09:19
Když tu funkci spustím z shellu tak to jede dobře - bez apostrofu

Script:
Kód: [Vybrat]
++ find /sata -maxdepth 1
nevypisuje nic

CMD Shellu:
Kód: [Vybrat]
++ find /sata -maxdepth 1

Vypisuje:
/sata
/sata/HRY
/sata/projekty
atd.

Tak mám to.

Chyba byla ve špatně nastaveném IFS. Respektive oddělovač je dobře, ale neuvědomil, jsme si, že jsem ho v tomto bloku nepřepnul. To mě nenapsalo, že tu může být kámen úrazu.

IFS=$'\n';
Název: Re: Jak dostat do grepu argument z proměnné?
Přispěvatel: Kit 06. 04. 2010, 06:48:09
Také se tam dají strčit všechny parametry funkce naráz:
Kód: [Vybrat]
subdirs=$(find $main_dir -maxdepth 1 | grep $@ | sort --stable -k "1");
Název: A ještě řeším podobnou situaci
Přispěvatel: webhope 06. 04. 2010, 14:20:12
A ještě řeším podobnou situaci. Potřebuju do souboru zapsat zalomení řádku, ale místo toho se mi tam zapíše \n.

Kód: [Vybrat]
PADDING="\\n\\n\\n\\n";
new_line="$PADDING$new_line $directory  $fs  $zbytek";
echo $new_line >> /etc/fstab

Výsledek zapsaný do /etc/fstab:
\n\n\n\nUUID="E0D8A16ED8A1441E" /sata/XP2 ntfs-3g defaults,umask=000 0 0
Název: Re: Jak dostat do grepu argument z proměnné?
Přispěvatel: deadmail 06. 04. 2010, 16:01:26
Citace
Potřebuju do souboru zapsat zalomení řádku, ale místo toho se mi tam zapíše \n.

Kód: [Vybrat]
echo -e "prvy\ndruhy"
Název: Re: Jak dostat do grepu argument z proměnné?
Přispěvatel: webhope 06. 04. 2010, 16:52:41
Joj, tak to je trapas. To už jsem dělal tolikrát a já na to zapomněl. Trapné. No