Portál AbcLinuxu, 8. prosince 2025 23:48
if [ ${MYARRAY} ]
then
echo "Pole je plne"
else
echo "Pole je prázdné"
fi
Řešení dotazu:
test ${#MYARRAY[*]} = 0
if [ ${#MYARRAY[*]} = 0 ]
then
echo "Pole je prázdné"
else
echo "Pole je plné"
fi
${#MYARRAY[*]} vrací počet prvků pole.
MYARRAY=
echo "Počet prvků v poli: ${#MYARRAY[*]}"
for((i=0;i<${#MYARRAY[*]};i++)) {
echo "${#MYARRAY[i]}"
}
Počet prvků v poli: 1 0
unset MYARRAY
echo "Počet prvků v poli: ${#MYARRAY[*]}"
for((i=0;i<${#MYARRAY[*]};i++)) {
echo "${#MYARRAY[i]}"
}
Počet prvků v poli: 0
A=(Ignorance strikes back)?
$ A=('')
$ echo ${#A[*]}
1
$ test -z "${A[*]}" && echo nic || echo nieco
nic
Vzdej to už
''.
Prázdný řetězec je plnohodnotný prvek pole, i když při výpisu na váš terminál se shodou okolností nevypíše žádný znak :)
Je to jako prázdná krabice od bot. Někoho sice zajímají výhradně ty boty, protože je třeba obuvník, tak všude vidí jen boty boty boty, ale skladníka zajímají i prázdné krabice.
Pokud mi někdo předal prázdnou krabici od bot bez tří mega (pole s prázdným řetězcem), je to zcela jiná situace, než kdyby žádná předávka vůbec neproběhla (prázdné pole).
const char p[] = {0, 0};
#!/bin/bash
A=('' '6*9' '' '42')
#A=('')
echo "Pole A obsahuje: ${#A[@]} položek"
for (( i=0 ; i < ${#A[@]} ; i++ ))
do
echo "Prvek $i má hodnotu: '${A[$i]}'"
done
man 1 test)
-n STRING
the length of STRING is nonzero
STRING equivalent to -n STRING
-z STRING
the length of STRING is zero
Cize moznost je if [ -n "${MYARRAY}" ], alebo if [ -z "${MYARRAY}" ] a potom spravne then/else.
$ MYARRAY=a
$ if [ -n "${MYARRAY}" ]; then echo "Pole je plne"; else echo "Pole je prázdné"; fi
Pole je plne
$ MYARRAY=
$ if [ -n "${MYARRAY}" ]; then echo "Pole je plne"; else echo "Pole je prázdné"; fi
Pole je prázdné
$
Pre zjednodusenie sa to da -n uplne vypustit, ale potom by menej znalym uz nemuselo byt jasne o co ide :)
$ MYARRAY=a
$ if [ "${MYARRAY}" ]; then echo "Pole je plne"; else echo "Pole je prázdné"; fi
Pole je plne
$ MYARRAY=
$ if [ "${MYARRAY}" ]; then echo "Pole je plne"; else echo "Pole je prázdné"; fi
Pole je prázdné
$
a mala drobnost na zaver. Tie uvodzovky tam maju svoje miesto ... kedze:
$ MYARRAY="a b"
$ if [ -n ${MYARRAY} ]; then echo "Pole je plne"; else echo "Pole je prázdné"; fi
-bash: [: a: binary operator expected
Pole je prázdné
$ if [ -n "${MYARRAY}" ]; then echo "Pole je plne"; else echo "Pole je prázdné"; fi
Pole je plne
$
Bez uvodzvoviek shell cely string najprv rozdeli podla $IFS a na zaklade toho dosadi ako argumenty. Inak povedane v provom priklade vidi test "-n a b" a to nie je co ocakava ...
a expanduje ${a} na obsah prvního prvku. Takže uvedné testy nefungují ani pro výše uvedený příkad
http://www.abclinuxu.cz/poradna/linux/show/363461#7 a viz také příspěvek od Ashe http://www.abclinuxu.cz/poradna/linux/show/363461#5
Obecně stringovými testy prostě neodlišíš nenastavené prvky od prázdných:
a=('')
vytvoří pole o jednom prázdném prvku, což není totéž jako prázdné pole, které vytvoří například
unset a declare -a a
$ A=(" ")
$ test -z "${A[*]}" && echo nic || echo nieco
nieco
$ A=(' ')
$ test -z "${A[*]}" && echo nic || echo nieco
nieco
$ A=('')
$ test -z "${A[*]}" && echo nic || echo nieco
nic
$ A=("")
$ test -z "${A[*]}" && echo nic || echo nieco
nic
a=(' ')
i
a=(" ")
když rozdíl je pouze v zápisu, obsah proměnné bude identický.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.