Portál AbcLinuxu, 10. května 2025 02:14

Dotaz: Bash: Nahrazení $P obsahem proměnný uvnitř for cyklu

David Watzke avatar 28.12.2005 00:51 David Watzke | skóre: 74 | blog: Blog... | Praha
Bash: Nahrazení $P obsahem proměnný uvnitř for cyklu
Přečteno: 223×
Odpovědět | Admin

Ahoj. Doufám, že jsem napsal výstižně titulek. :) Hodím jsem jen nejpodstatnější info ohledně skriptu, kterej píšu a na závěr řeknu problém.

FIX=`echo hal \ # jmeno-baliku je $1, ale to jen aby bylo jasno, dal jsem příklad balík hal
| sed -e 's/=//g' \
      -e 's/\[[[digit:]].*\]//' \
      -e 's/-[[:digit:]].*$//'`

CP=`emerge -p --nodeps $FIX \
| grep 'ebuild ' \
| tail -n 2 \
| head -n 1 \
| sed -e 's/\[ebuild.......\]\ //' \
      -e 's/ //g'`

CPN=`echo $CP \
| sed -e 's/\[[[digit:]].*\]//' \
      -e 's/-[[:digit:]].*$//'`

PN=`echo $CPN | cut -d/ -f2`
GP="http://gentoo-portage.com"
wget -qc $GP/$CPN
HTTP="$GP`sed -n 's/.*href="\([^"]\+\).*/\1/gp' $PN | grep ebuild | head -n 1`"
P=`echo $HTTP | sed 's/%2F/\//g' | cut -d/ -f6`
EBUILD="/usr/portage/$CPN/$P"
rm -f $PN 2> /dev/null

if [ "`grep epatch echoBUILD`" != "" ]
 then
# a taky přichází problém
  for F in `grep epatch echoBUILD | sed -n 's/.*"\([^"]\+\).*/\1/gp' | sed 's/${FILESDIR}//g'`
  do
   PATCH="/usr/portage/$CPN/files${F}"
   echo $PATCH
   # další, zatím nepodstatný příkazy
  done
fi
Díky tomu to na mě vysype
/usr/portage/sys-apps/hal/files/${P}-RBC.patch
/usr/portage/sys-apps/hal/files/${PN}-0.5.1-old_storage_policy.patch
Jenže já tam ty proměnný uvedený mám a on je nevymění! Až když debuguju po jednom řádku v terminálu, tak zjistím, že když pak ještě řeknu:
echo /usr/portage/sys-apps/hal/files/${P}-RBC.patch
echo /usr/portage/sys-apps/hal/files/${PN}-0.5.1-old_storage_policy.patch
tak to vymění správně, ale jakmile to zapíšu do skriptu, zase to samý. :-( Achjo. Nevíte co s tím?

PS: Pokud vás zajímá, co je zač ten skript, vydržte, protože když s ním nebudou další problémy budu o něm informovat v blogu.

“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

28.12.2005 01:46 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Bash: Nahrazení $P obsahem proměnný uvnitř for cyklu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nebyla by ukázka, jak vlastně vypadá ten soubor echoBUILD? Ne každý zná Gentoo tak detailně, aby si to dokázal z hlavy představit.

Jinak místo

  if [ "`grep epatch echoBUILD`" != "" ]; then
je jednodušší (a efektivnější)
  if grep -q epatch echoBUILD; then
David Watzke avatar 28.12.2005 01:48 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Nahrazení $P obsahem proměnný uvnitř for cyklu
Já jsem... to zrovna chtěl napsat. Než jsem to poslal, nahrazoval jsem trochu. Má to být $EBUILD. :-( Takže to je ebuild.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
David Watzke avatar 28.12.2005 01:50 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Nahrazení $P obsahem proměnný uvnitř for cyklu
Ten si mimochodem můžeš nechat zobrazit na gentoo-portage.com. Namátkou třeba takovej...
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
28.12.2005 02:25 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Bash: Nahrazení $P obsahem proměnný uvnitř for cyklu
No tak to je celkem jasné. Výsledkem expanze proměnné F je sice něco, co sice obsahuje znaky '$', ale ty už se samozřejmě znovu neexpandují, jinak byste mohl shell triviálně poslat do nekonečné smyčky a nebylo by možné jako výsledek expanze dostat nic, co obsahuje '$'. Napadají mne tři možnosti:
  1. použít eval
  2. výsledek toho sedu doplnit o přiřazení a includovat
  3. nechat si ty proměnné nahradit rovnou tím sedem
Pokud jsou tam vždy jen P a PN, přikláněl bych se ke třetí variantě. První dvě jsou tak trochu "o hubu".
David Watzke avatar 28.12.2005 02:39 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Nahrazení $P obsahem proměnný uvnitř for cyklu
Jsou ty vždy jen P a PN. Jenže je tu problém. Jak to nahradím sedem, když $P a $PN jsou zase jen proměnný? :(
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
28.12.2005 03:16 Dunric | skóre: 21
Rozbalit Rozbalit vše Re: Bash: Nahrazení $P obsahem proměnný uvnitř for cyklu
Např. takto ?
... | sed "s/\${P}/${P}/g"
In the garden sleeps a messenger ·
David Watzke avatar 28.12.2005 03:30 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Nahrazení $P obsahem proměnný uvnitř for cyklu
Funguje, dík.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
David Watzke avatar 28.12.2005 01:52 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Nahrazení $P obsahem proměnný uvnitř for cyklu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Možná bude vhodnější, když vám ukážu celý soubor. Tady je.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.