Portál AbcLinuxu, 10. května 2025 08:35
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 nicVzdej 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 zeroCize 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.