PowerShell zamiast tablic w Bashu (follow up) || tablice część druga

**
Dyzklejmer**

  1. Nie oddycham PowerShellem i nie mam nawyków powershellowych.
  2. Potrafię korzystać z wyszukiwarki internetowej.
  3. To nie jest tutorial.
  4. Serio, nie wszystko musi mieć sens.
  5. Put the fun back into computing.

**Po co ten wpis **
Chciałem sprawdzić, jaki jest próg wejścia w PowerShella na Linuksie, a po kilku dniach przeczytać ten wpis, by stwierdzić, jak bardzo było głupie to, co chciałem osiągnąć.

"A więc…"
Ten wpis to w zasadzie follow up do poprzedniego wpisuIterowanie po tablicach w Bashu](openSUSE Forums). Tablice w Bashu nie są oczywiste w każdym aspekcie. Na przykład: na ogół muszę przemyśleć, jak przekazać tablicę do utworzonej funkcji.

Czemu więc nie rzucić okiem na ten sam problem z kompletnie innej perspektywy?

I tyle wstępu.

Instalacja
Microsoft nie dostarcza RPMów z PowerShellem dla SUSE i openSUSE:
docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-linux

Owszem, można znaleźć RPMy na software.opensuse.org.

Ja wybrałem instalację ze snapa:
snapcraft.io/install/snap-store/opensuse

sudo snap install powershell --classic

Shebang

which pwsh
#!/snap/bin/pwsh

Edytor
Używam nano i dodałem sobie coś takiego:

Kod

Zamiast tablicy w Bashu
Niechlujną na szybko robioną tablicę z Basha, musiałem zastąpić czymś takim - każdy string musiał być w cudzysłowiu i oddzielony przecinkiem:

$RPMS = "TESTOWY_NIE_MA_TAKIEGO_PAKIETU","nie_ma","cheese-lang",
        "gdm-lang","gnome-contacts-lang","gnome-control-center-color",
        "gnome-control-center-goa","gnome-control-center-lang","gnome-session-lang",
        "gnome-session-wayland","gnome-shell-calendar","gnome-shell-classic","gnome-shell-extension-gpaste",
        "gnome-shell-lang","gnome-shell-search-provider-bijiben","gnome-shell-search-provider-contacts","gnome-shell-search-provider-documents",
        "gnome-shell-search-provider-nautilus","gnome-tweaks-lang","gstreamer-plugins-bad-lang","libpurple-lang","libpurple-tcl","pidgin",
        "pulseaudio-gdm-hooks","cheese","gnome-shell-extension-desktop-icons","gnome-contacts","gnome-tweaks","libpurple","patterns-gnome-gnome",
        "patterns-gnome-gnome_imaging","patterns-gnome-gnome_office","patterns-gnome-gnome_utilities",
        "libpurple-branding-openSUSE","patterns-gnome-gnome_x11","gstreamer-plugins-farstream","patterns-gnome-gnome_basic",
        "libfarstream-0_2-5","patterns-gnome-gnome_basis","gdm-branding-openSUSE","gdm","gnome-shell","gnome-session-default-session","gnome-session",
        "gnome-control-center","libcheese-gtk25","libcheese8","gstreamer-plugins-bad"

Iterowanie
I tu zaczyna być ciekawie. Zamiast przeszukiwać ${RPMS@]}, przekierowuję cały obiekt $RPMS do pętli

$RPMS | ForEach { rpm -q --queryformat "%{NAME}
" $_ }

Kod wyjśćia
Zamiast zera mam true a $? jest od razu interpretowane:

PS /home/geeko/scripts> $?
True

Operator warunkowy

<condition> ? <if-true> : <if-false>

Co dało mi możliwość łatwego przekazania kodu wyjścia, czyli:

$? ? <if-true> : <if-false>

Budowanie obiektów
Tu miałem trudność. Ostatecznie utworzyłem dwie puste listy i skorzystałem z metody .Add:

$INSRPMS = New-Object System.Collections.Generic.List[System.Object]

$INSRPMS.Add("kolejnaPaczka")

**

&> /dev/null**

out-null

**Kolorowanie i formatowanie wyników
**-ForegroundColor przyjmuje wartości w postaci nazw kolorów, a przed zmienną przechowującą nazwę paczki dodałem po prostu dwie spacje:

Write-Host -ForegroundColor Green "  $_"

Całość

#!/snap/bin/pwsh

$RPMS = "TESTOWY_NIE_MA_TAKIEGO_PAKIETU","nie_ma","cheese-lang",
        "gdm-lang","gnome-contacts-lang","gnome-control-center-color",
        "gnome-control-center-goa","gnome-control-center-lang","gnome-session-lang",
        "gnome-session-wayland","gnome-shell-calendar","gnome-shell-classic","gnome-shell-extension-gpaste",
        "gnome-shell-lang","gnome-shell-search-provider-bijiben","gnome-shell-search-provider-contacts","gnome-shell-search-provider-documents",
        "gnome-shell-search-provider-nautilus","gnome-tweaks-lang","gstreamer-plugins-bad-lang","libpurple-lang","libpurple-tcl","pidgin",
        "pulseaudio-gdm-hooks","cheese","gnome-shell-extension-desktop-icons","gnome-contacts","gnome-tweaks","libpurple","patterns-gnome-gnome",
        "patterns-gnome-gnome_imaging","patterns-gnome-gnome_office","patterns-gnome-gnome_utilities",
        "libpurple-branding-openSUSE","patterns-gnome-gnome_x11","gstreamer-plugins-farstream","patterns-gnome-gnome_basic",
        "libfarstream-0_2-5","patterns-gnome-gnome_basis","gdm-branding-openSUSE","gdm","gnome-shell","gnome-session-default-session","gnome-session",
        "gnome-control-center","libcheese-gtk25","libcheese8","gstreamer-plugins-bad"

$INSRPMS = New-Object System.Collections.Generic.List[System.Object]
$MISRPMS = New-Object System.Collections.Generic.List[System.Object]

$RPMS | ForEach {
  rpm -q --queryformat "%{NAME}
" $_ | out-null
  $? ? $INSRPMS.Add($_) : $MISRPMS.Add($_)
}

Write-Host "Installed RPMs:"
$INSRPMS | ForEach { Write-Host -ForegroundColor Green "  $_" }
Write-Host "`nMissing RPMs:"
$MISRPMS | ForEach { Write-Host -ForegroundColor Red "  $_" }

**
Jakie strony były pomocne**
Złożenie w/w poszło mi dość sprawnie. Najbardziej pomocne były strony Microsoftu. Z drugiej strony, nowicjuszem w skryptowaniu nie jestem, więc nieco łatwiej mi wyrazić, co jest mi potrzebne do osięgnięcia rezultatu.

$RPMS | ForEach {
  rpm -q --queryformat "%{NAME}
" $_ | out-null
  $? ? $INSRPMS.Add($_) : $MISRPMS.Add($_)
}

Przecież w Bashu też tak można, o czym zapomniałem skupiając się właśnie na poprawnym zbudowaniu i obsłużeniu tablicy:

for i in ${RPMS@]}; do
  rpm -q --queryformat "%{NAME}
" ${i} &> /dev/null
   $? -eq 0 ] && INSRPMS=(${INSRPMS@]} $i) || MISRPMS=(${MISRPMS@]} $i)
done