Portál AbcLinuxu, 6. června 2024 01:31


Dotaz: Nefunguje for loop v bourne shell

27.5.2016 20:22 majales | skóre: 29 | blog: Majales
Nefunguje for loop v bourne shell
Přečteno: 362×
Odpovědět | Admin
Zdravím, Mám problém s jedním skriptem kterým klonuju VM na ESXi. Nefunguje tam správně for smyčka, pokud má stroj více než jeden disk.
VM_VMDK_DESCRS=$(ls "$OLDVMSTORE/$OLDVM" | grep ".vmdk" | grep -v "\-flat.vmdk")
for VMDK in "${VM_VMDK_DESCRS}"
do
  echo "Cloning VMDK : $VMDK"
  NEWVMDK=$(echo ${VMDK##*/} | sed "s/$OLDVM/$NEWVM/")
  vmkfstools -i "$OLDVMSTORE/$OLDVM/$VMDK" "$NEWVMSTORE/$NEWVM/$NEWVMDK" -d thin
  echo
skript selže protože v té smyčce se mu objeví oba ty nalezené disky
ls /vmfs/volumes/datastore1/DSMON01 |grep ".vmdk" | gr
ep -v "\-flat.vmdk" | hexdump -C
00000000  44 53 4d 4f 4e 30 31 2e  76 6d 64 6b 0a 44 53 4d  |DSMON01.vmdk.DSM|
00000010  4f 4e 30 31 5f 31 2e 76  6d 64 6b 0a              |ON01_1.vmdk.|
Přičemž separátor je tady 0a což by měl být linefeed.

Nevíte jak upravit ten for aby to začalo chodit? Zkoušel jsem přidat IFS=$'\n' ale nepomohlo to. Díky za každou radu.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

27.5.2016 21:46 NN
Rozbalit Rozbalit vše Re: Nefunguje for loop v bourne shell
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tipnu, ze problem bude tady:
sed "s/$OLDVM/$NEWVM/"
Protoze, nahradis dvakrat to same..
28.5.2016 00:47 Ondřej Kubečka | skóre: 29 | blog: datlovo | Ulm
Rozbalit Rozbalit vše Re: Nefunguje for loop v bourne shell
Odpovědět | | Sbalit | Link | Blokovat | Admin
Řeším pouze smyčku:

for i in "abc def"; do echo $i; done proběhne jednou a vypíše řetězec: abc def

for i in abc def; do echo $i; done proběhne dvakrát a vypíše řetězce: abc a def

Když tak ale koukám na to řetězení ls a 2x grep. Tak spíše něco jako... for vdmk in "${OLDVMSTORE}/${OLDVM}"/*.vdmk*; do ...; done. Ve smyčce můžete vyřídit případný -flat.vdmk (pokud substring, pak continue).

A ještě poznámka: ls | grep .vdmk není ls *.vdmk* (což jste asi chtěl), ale ls *?vdmk* (což je spíše omyl?).
http://prirucka.ujc.cas.cz/?ref=785&id=790.
Řešení 1× (jose17)
28.5.2016 08:48 majales | skóre: 29 | blog: Majales
Rozbalit Rozbalit vše Re: Nefunguje for loop v bourne shell
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nakonec jsem to upravil takto:
VM_VMDK_DESCRS=$(ls "$OLDVMSTORE/$OLDVM" | grep ".vmdk" | grep -v "\-flat.vmdk")
for VMDK in ${VM_VMDK_DESCRS//\\n/ }
do
  echo "Cloning VMDK : $VMDK"
  #echo "MEZERA"
  NEWVMDK=$(echo ${VMDK##*/} | sed "s/$OLDVM/$NEWVM/")
  vmkfstools -i "$OLDVMSTORE/$OLDVM/$VMDK" "$NEWVMSTORE/$NEWVM/$NEWVMDK" -d thin
  echo
done
Funguje to. Díky všem.
30.5.2016 20:33 Ondřej Kubečka | skóre: 29 | blog: datlovo | Ulm
Rozbalit Rozbalit vše Re: Nefunguje for loop v bourne shell
Možná jsem to nevysvětlil dost jasně, ale tohle nezačalo "fungovat", protože je tam ta náhrada vzorce (${VM_VMDK_DESCRS//\\n/ }), která na to nemá vliv, ale protože kolem ${VM_VMDK_DESCRS} (s náhradou nebo bez) už nejsou uvozovky.
k3dAR avatar 30.5.2016 21:35 k3dAR | skóre: 62
Rozbalit Rozbalit vše Re: Nefunguje for loop v bourne shell
ja ti pomuzu :)
# tahle smycka pojede 3x protoze jde o 3 nezavisle vstupy
for neco in jedna dva tri; do

# tahle smycka pojede 1x protoze jde o 1 souvislej vstup
for neco in "jedna dva tri"; do
a je jedno jestli jde o vypsane vstupy primo ve smycce, nebo jde o promenou ktera je obsahuje
porad nemam telo, ale uz mam hlavu... nobody

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.