Portál AbcLinuxu, 12. května 2025 07:33

Dotaz: BASH : Jak zjistit, jestli je položky již v array?

11.12.2012 10:55 AleX
BASH : Jak zjistit, jestli je položky již v array?
Přečteno: 275×
Odpovědět | Admin
Ahoj, poradí někdo jak to zjistit? Díky
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

11.12.2012 11:17 l4m4
Rozbalit Rozbalit vše Re: BASH : Jak zjistit, jestli je položky již v array?
Odpovědět | | Sbalit | Link | Blokovat | Admin
for-cyklem, který projde celé pole (for x in "${a[@]}"...) a položky pěkně po jedné porovná pomocí test. A během psaní toho cyklu přemýšlet, zda je bash pro tuto úlohu vhodný nástroj...
11.12.2012 11:30 AleX
Rozbalit Rozbalit vše Re: BASH : Jak zjistit, jestli je položky již v array?
Díky, V každém případě to vhodný jazyk není!

Tak jsem to sesmolil ale nejde mi to, co je tam zle? Díky
in_array() {
     for x in "${a[@]}"
     do
          if [ "$1" == "x" ]
          then
               return 0
          else
               return 1
          fi
     done
} 

if in_array "czech"
then
      echo je
else
      echo neni
fi
11.12.2012 11:48 l4m4
Rozbalit Rozbalit vše Re: BASH : Jak zjistit, jestli je položky již v array?
Přinejmenším chybí $ u x.
11.12.2012 11:52 AleX
Rozbalit Rozbalit vše Re: BASH : Jak zjistit, jestli je položky již v array?
Tím to ale není...
11.12.2012 11:56 AleX
Rozbalit Rozbalit vše Re: BASH : Jak zjistit, jestli je položky již v array?
Ještě bych to mohl napsat i takto, ale výsledek je stejný
in_array() {
 for x in "${a[@]}"
 do
  if [ "$1" == "$x" ]
  then
   return 0
   break
  fi
 done
 return 1
} 

in_array "czech"
if [ $? == 0 ]
then
      echo "je"
else
      echo "neni"
fi
11.12.2012 12:01 l4m4
Rozbalit Rozbalit vše Re: BASH : Jak zjistit, jestli je položky již v array?
Jo, a samozřejmě return je zapotřebí udělat pouze, když najdeš, jinak kontroluješ pouze první položku...
11.12.2012 12:06 Ash | skóre: 53
Rozbalit Rozbalit vše Re: BASH : Jak zjistit, jestli je položky již v array?
Tohle už funguje. Ještě někam na začátek dejte to pole, třeba
a[0]="x"
a[1]="czech"
a[2]="y"
a uvidíte, jak vám to pěkně půjde.

Pro ladění doporučuji třeba toto:
 for x in "${a[@]}"
 do
   echo "arr: $x == $1"
11.12.2012 12:08 Ash | skóre: 53
Rozbalit Rozbalit vše Re: BASH : Jak zjistit, jestli je položky již v array?
Jo a break je nadbytečný.
11.12.2012 12:19 AleX
Rozbalit Rozbalit vše Re: BASH : Jak zjistit, jestli je položky již v array?
break jsem tam dal proto, aby když najde shodu, neprocházel zbytečné zbytek pole, je to špatně?
11.12.2012 12:40 Kit
Rozbalit Rozbalit vše Re: BASH : Jak zjistit, jestli je položky již v array?
Po returnu se ten break stejně už neprovede.
11.12.2012 14:57 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: BASH : Jak zjistit, jestli je položky již v array?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud dokážeš ovlivnit, jak pole vzniká, tak stačí použít asociativní pole
$ declare -A dict
$ dict["foo"]="foo"
$ if [[ ${dict["foo"]} != '' ]]; then echo "je tam"; fi
je tam
$ if [[ ${dict[42]} != '' ]]; then echo "je tam"; fi
$
Nejsem si teda jistý, jak je to interně implementováno, takže asociativní pole nemusí garantovat pořadí, ale v bashi člověk nikdy neví.
When your hammer is C++, everything begins to look like a thumb.
11.12.2012 15:39 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: BASH : Jak zjistit, jestli je položky již v array?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Predpokladajme, ze znak | sa nevyskytuje nikde v poli.
pole=( a b c )
IFS='|'
[[ "${pole[*]}" == *a* ]] &&
  echo hura
If you hold a Unix shell up to your ear, you can you hear the C.
11.12.2012 15:43 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: BASH : Jak zjistit, jestli je položky již v array?
Eeeeee, oprava:
pole=( aaa bb c )
IFS='|'
[[ "|${a[*]}|" == *"|bb|"* ]] &&
  echo hura
If you hold a Unix shell up to your ear, you can you hear the C.

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.