Pole je proměnná obsahující více hodnot, které mohou být stejného typu nebo různého typu. Neexistuje žádné maximální omezení velikosti pole ani žádný požadavek, aby členské proměnné byly indexovány nebo přiřazeny souvisle. Index pole začíná nulou.
V tomto článku se podíváme na 15 různých operací s poli v bash.
Tento článek je součástí probíhající série Bash Tutorial. Pro ty, kteří začínají se skriptováním bash, začněte s výukovým programem Úvod do skriptování v bash.
1. Deklarace pole a přiřazení hodnot
V bash se pole vytvoří automaticky, když je použita proměnná ve formátu jako,
name[index]=value
- název je libovolný název pole
- index může být libovolné číslo nebo výraz, který musí být vyhodnocen jako číslo větší nebo rovné nule. Explicitní pole můžete deklarovat pomocí příkazu deklarovat -a název pole.
$ cat arraymanip.sh #! /bin/bash Unix[0]='Debian' Unix[1]='Red hat' Unix[2]='Ubuntu' Unix[3]='Suse' echo ${Unix[1]} $./arraymanip.sh Red hat
Pro přístup k prvku z pole použijte složené závorky jako ${name[index]}.
2. Inicializace pole během deklarace
Namísto inicializace každého prvku pole samostatně, můžete pole deklarovat a inicializovat zadáním seznamu prvků (oddělených mezerou) ve složených závorkách.
Syntax: declare -a arrayname=(element1 element2 element3)
Pokud mají prvky mezeru, uzavřete ji do uvozovek.
#! /bin/bash $cat arraymanip.sh declare -a Unix=('Debian' 'Red hat' 'Red hat' 'Suse' 'Fedora');
deklarovat -a deklaruje pole a všechny prvky v závorkách jsou prvky pole.
3. Vytiskněte celé pole Bash
Existují různé způsoby, jak vytisknout celé prvky pole. Pokud je číslo indexu @ nebo *, odkazují se na všechny členy pole. Můžete procházet prvky pole a tisknout je pomocí cyklických příkazů v bash.
echo ${Unix[@]} # Add the above echo statement into the arraymanip.sh #./t.sh Debian Red hat Ubuntu Suse
Odkazování na obsah členské proměnné pole bez uvedení čísla indexu je stejné jako odkazování na obsah prvního prvku, toho, na který se odkazuje s číslem indexu nula.
4. Délka pole Bash
Délku pole můžeme získat pomocí speciálního parametru $#.
${#arrayname[@]} vám udává délku pole.
$ cat arraymanip.sh declare -a Unix=('Debian' 'Red hat' 'Suse' 'Fedora'); echo ${#Unix[@]} #Number of elements in the array echo ${#Unix} #Number of characters in the first element of the array.i.e Debian $./arraymanip.sh 4 6
5. Délka n-tého prvku v poli
${#arrayname[n]} by měl udávat délku n-tého prvku v poli.
$cat arraymanip.sh #! /bin/bash Unix[0]='Debian' Unix[1]='Red hat' Unix[2]='Ubuntu' Unix[3]='Suse' echo ${#Unix[3]} # length of the element located at index 3 i.e Suse $./arraymanip.sh 4
6. Extrakce podle offsetu a délky pro pole
Následující příklad ukazuje způsob, jak extrahovat 2 prvky počínaje pozicí 3 z pole nazvaného Unix.
$cat arraymanip.sh Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); echo ${Unix[@]:3:2} $./arraymanip.sh Suse Fedora
Výše uvedený příklad vrací prvky ve 3. indexu a čtvrtém indexu. Index vždy začíná nulou.
7. Extrakce s posunem a délkou pro konkrétní prvek pole
Chcete-li extrahovat pouze první čtyři prvky z prvku pole. Například Ubuntu, které se nachází na druhém indexu pole, můžete použít offset a délku pro konkrétní prvek pole.
$cat arraymanip.sh #! /bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); echo ${Unix[2]:0:4} ./arraymanip.sh Ubun
Výše uvedený příklad extrahuje první čtyři znaky z 2. indexovaného prvku pole.
8. Hledat a nahradit v prvcích pole
Následující příklad hledá Ubuntu v prvcích pole a nahradí je slovem „SCO Unix“.
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); echo ${Unix[@]/Ubuntu/SCO Unix} $./arraymanip.sh Debian Red hat SCO Unix Suse Fedora UTS OpenLinux
V tomto příkladu nahradí prvek ve 2. indexu „Ubuntu“ za „SCO Unix“. Tento příklad však trvale nenahradí obsah pole.
9. Přidejte prvek do existujícího pole Bash
Následující příklad ukazuje způsob, jak přidat prvek do existujícího pole.
$cat arraymanip.sh Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Unix=("${Unix[@]}" "AIX" "HP-UX") echo ${Unix[7]} $./arraymanip.sh AIX
V poli nazvaném Unix jsou prvky „AIX“ a „HP-UX“ přidány do 7. a 8. indexu.
10. Odebrat prvek z pole
unset se používá k odstranění prvku z pole.unset bude mít stejný účinek jako přiřazení null prvku.
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); unset Unix[3] echo ${Unix[3]}
Výše uvedený skript pouze vypíše hodnotu null, což je hodnota dostupná ve 3. indexu. Následující příklad ukazuje jeden ze způsobů, jak zcela odstranit prvek z pole.
$ cat arraymanip.sh Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); pos=3 Unix=(${Unix[@]:0:$pos} ${Unix[@]:$(($pos + 1))}) echo ${Unix[@]} $./arraymanip.sh Debian Red hat Ubuntu Fedora UTS OpenLinux
V tomto příkladu vám ${Unix[@]:0:$pos} poskytne 3 prvky začínající od 0. indexu, tj. 0,1,2 a ${Unix[@]:4} poskytne prvky od 4. indexu po poslední index. A sloučit oba výše uvedené výstupy. Toto je jedno z řešení odstranění prvku z pole.
11. Odeberte prvky Bash Array pomocí Patterns
Ve vyhledávací podmínce můžete zadat vzory a uložit zbývající prvek do jiného pole, jak je znázorněno níže.
$ cat arraymanip.sh #!/bin/bash declare -a Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora'); declare -a patter=( ${Unix[@]/Red*/} ) echo ${patter[@]} $ ./arraymanip.sh Debian Ubuntu Suse Fedora
Výše uvedený příklad odstraní prvky, které mají vzor Red*.
12. Kopírování pole
Rozbalte prvky pole a uložte je do nového pole, jak je znázorněno níže.
#!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Linux=("${Unix[@]}") echo ${Linux[@]} $ ./arraymanip.sh Debian Red hat Ubuntu Fedora UTS OpenLinux
13. Zřetězení dvou Bash Array
Rozbalte prvky dvou polí a přiřaďte je novému poli.
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh'); UnixShell=("${Unix[@]}" "${Shell[@]}") echo ${UnixShell[@]} echo ${#UnixShell[@]} $ ./arraymanip.sh Debian Red hat Ubuntu Suse Fedora UTS OpenLinux bash csh jsh rsh ksh rc tcsh 14
Vypíše pole, které obsahuje prvky pole „Unix“ i „Shell“ a počet prvků nového pole je 14.
14. Odstranění celého pole
unset se používá k odstranění celého pole.
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh'); UnixShell=("${Unix[@]}" "${Shell[@]}") unset UnixShell echo ${#UnixShell[@]} $ ./arraymanip.sh 0
Po zrušení nastavení pole by jeho délka byla nula, jak je uvedeno výše.
15. Načíst obsah souboru do pole
Obsah souboru můžete načíst řádek po řádku do pole.
#Example file $ cat logfile Welcome to thegeekstuff Linux Unix $ cat loadcontent.sh #!/bin/bash filecontent=( `cat "logfile" `) for t in "${filecontent[@]}" do echo $t done echo "Read file content!" $ ./loadcontent.sh Welcome to thegeekstuff Linux Unix Read file content!
Ve výše uvedeném příkladu se každý index prvku pole vytiskl přes smyčku for.
Doporučená četba
Bash 101 Hacks, od Rameshe Natarajan . Většinu času trávím v prostředí Linuxu. Takže jsem přirozeně velkým fanouškem Bash příkazového řádku a skriptování v shellu. Před 15 lety, když jsem pracoval na různých variantách *nix, jsem psal hodně kódu na C shellu a Korn shellu. Později, když jsem začal pracovat na Linuxu jako správce systému, jsem téměř automatizoval všechny možné úkoly pomocí skriptování v prostředí Bash. Na základě mých zkušeností s Bash jsem napsal e-knihu Bash 101 Hacks, která obsahuje 101 praktických příkladů jak pro příkazový řádek Bash, tak pro skriptování shellu. Pokud přemýšlíte o zvládnutí Bash, udělejte si laskavost a přečtěte si tuto knihu, která vám pomůže převzít kontrolu nad příkazovým řádkem Bash a skriptováním shellu.