View RSS Feed

pbojczuk

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

Rate this Entry

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 wpisu Iterowanie po tablicach w Bashu. 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

Code:
sudo snap install powershell --classic
Shebang
Code:
which pwsh
Code:
#!/snap/bin/pwsh
Edytor
Używam nano i dodałem sobie coś takiego:
https://github.com/mitchell486/nanorc

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:
Code:
$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
Code:
$RPMS | ForEach { rpm -q --queryformat "%{NAME}\n" $_ }
Kod wyjśćia
Zamiast zera mam true a $? jest od razu interpretowane:
Code:
PS /home/geeko/scripts> $?
True
Operator warunkowy
Code:
<condition> ? <if-true> : <if-false>
Co dało mi możliwość łatwego przekazania kodu wyjścia, czyli:
Code:
$? ? <if-true> : <if-false>
Budowanie obiektów
Tu miałem trudność. Ostatecznie utworzyłem dwie puste listy i skorzystałem z metody .Add:
Code:
$INSRPMS = New-Object System.Collections.Generic.List[System.Object]

$INSRPMS.Add("kolejnaPaczka")


&> /dev/null

Code:
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:
Code:
Write-Host -ForegroundColor Green "  $_"
Całość
Code:
#!/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}\n" $_ | 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.

Submit "PowerShell zamiast tablic w Bashu (follow up) || tablice część druga" to Digg Submit "PowerShell zamiast tablic w Bashu (follow up) || tablice część druga" to del.icio.us Submit "PowerShell zamiast tablic w Bashu (follow up) || tablice część druga" to StumbleUpon Submit "PowerShell zamiast tablic w Bashu (follow up) || tablice część druga" to Google Submit "PowerShell zamiast tablic w Bashu (follow up) || tablice część druga" to Facebook Submit "PowerShell zamiast tablic w Bashu (follow up) || tablice część druga" to Twitter

Updated 07-Jan-2022 at 14:36 by pbojczuk

Tags: powershell, snap
Categories
Uncategorized

Comments

  1. pbojczuk's Avatar
    Code:
    $RPMS | ForEach {
      rpm -q --queryformat "%{NAME}\n" $_ | 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:
    Code:
    for i in ${RPMS[@]}; do
      rpm -q --queryformat "%{NAME}\n" ${i} &> /dev/null
      [ $? -eq 0 ] && INSRPMS=(${INSRPMS[@]} $i) || MISRPMS=(${MISRPMS[@]} $i)
    done