Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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:
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:
d=" -e linux "
subdirs=$(find $main_dir -maxdepth 1 | `grep -i $d` | sort --stable -k "1");
-
Zkus:
grep '$PROM' soubor
viz. http://tldp.org/LDP/abs/html/quoting.html (http://tldp.org/LDP/abs/html/quoting.html)
-
Tohle nepomáhá
find $main_dir -maxdepth 1 | grep -i '$d'
-
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).
-
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.
-
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.
-
Jenže při nastavování proměnné uvozovky použít musím. Proměnná může obsahovat více e parametrů.
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:
+++ 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.
-
+++ 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.
-
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:
+++ find /sata -maxdepth 1
+++ grep '-e xp -e win' -i
+++ sort --stable -k 1
++ subdirs=
++ echo
ZJEDNODUŠENY KOD:
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:
# 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:/'
-
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:
+++ find /sata -maxdepth 1
+++ grep '-e xp -e win' -i
+++ sort --stable -k 1
++ subdirs=
++ echo
ZJEDNODUŠENY KOD:
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 ...
+ 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:
d="xp|win"
find ... | egrep -i "$d" | sort --stable
Prepinac -k 1 je defaultne nastavenie sortu (tried podla celeho riadku), teda sa nemusi zapisovat
-
Když tu funkci spustím z shellu tak to jede dobře - bez apostrofu
Script:
++ find /sata -maxdepth 1
nevypisuje nic
CMD Shellu:
++ 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';
-
Také se tam dají strčit všechny parametry funkce naráz:
subdirs=$(find $main_dir -maxdepth 1 | grep $@ | sort --stable -k "1");
-
A ještě řeším podobnou situaci. Potřebuju do souboru zapsat zalomení řádku, ale místo toho se mi tam zapíše \n.
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
-
Potřebuju do souboru zapsat zalomení řádku, ale místo toho se mi tam zapíše \n.
echo -e "prvy\ndruhy"
-
Joj, tak to je trapas. To už jsem dělal tolikrát a já na to zapomněl. Trapné. No