[bash] wie letzte drei Stellen einer Variable abgreifen?

  • ein Script wird mit zwei Argumenten aufgerufen, der SID (Service-Id) und der Kanalnummer.


    declare SID="$1"
    declare NUMBER="$2"



    im Script möchte ich jetzt eine weitere Variable EXTERNCHANNEL definieren. Diese soll sich aus den letzten zwei Stellen der SID ableiten, also z.B. SID=9044, dann soll EXTERNCHANNEL= 44 sein.


    Ideal wäre es, wenn das Resultat keine Vornull hätte, also 9001 soll nicht 01 sondern nur 1 werden.


    Hoffe, das ist nicht zu schwierig ...

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    Einmal editiert, zuletzt von Dr. Seltsam ()

  • Quick and dirty:


    morris:~# echo 12345 | sed 's/.*\(..\)$/\1/' | sed 's/^0//'
    45
    morris:~# echo 12305 | sed 's/.*\(..\)$/\1/' | sed 's/^0//'
    5

    VDR: ASUS AT3ION-T, 2GB, Satix S2 Dual, 1TB 2.5", yavdr 0.4
    Server: Intel DH67CF, Pentium G620, 8GB, 2x1000GB 2.5" Raid1, WLAN, Ubuntu 12.04 @22W
    TV: Panasonic P50G30

  • Zitat

    Original von tag
    Wenn's immer eine Zahl ist:
    echo $((NUMBER % 100))


    klappt das auch, wenn die SID 3-stellig oder 5-stellig ist?

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD

  • @ andreash:


    Code
    declare SID="$1"
    declare VIDEONUMBER="$2"
    declare EXTERNCHANNEL=`echo "$SID"| sed 's/.*\(..\)$/\1/' | sed 's/^0//'`


    klappt prima, danke!


    Für den Fall, dass ich die letzten 3 Stellen statt deren zwei abgreifen will:
    Ein Punkt mehr (...\) funktioniert, aber was müsste ich dann noch machen, damit nicht nur


    9011 -> 11 wird, sondern auch


    9001 -> 1 wird?

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD

  • Warum rechnest du nicht einfach modulo 1000?



    SID=6777
    let "SID = SID % 1000"
    echo $SID

  • Zitat

    Original von wirbel
    Warum rechnest du nicht einfach modulo 1000?



    SID=6777
    let "SID = SID % 1000"
    echo $SID


    Code
    declare SID="$1"
    declare VIDEONUMBER="$2"
    declare EXTERNCHANNEL
    let "EXTERNCHANNEL = SID % 1000"


    funzt perfekt, egal wieviele Stellen die SID hat


    :cool1

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD


  • Code
    EXTERNCHANNEL=${SID:(-2):2}
    EXTERNCHANNEL=${EXTERNCHANNEL#"${EXTERNCHANNEL%%[!0]*}"}


    sollte mit builtins ebensogut funktionieren und beliebig viel 'trailing zeroes' erfassen. Dein sed kann dann in der Garage bleiben.


    Christian


  • Der Vollstaendigkeit halber:


    echo 123005 | sed 's/.*\(...\)$/\1/' | sed 's/^0*//'


    "Entferne beliebig viele fuehrende Nullen"


    Wobei bei rein numerischen Werten die Modulo-Variante eleganter ist.

    VDR: ASUS AT3ION-T, 2GB, Satix S2 Dual, 1TB 2.5", yavdr 0.4
    Server: Intel DH67CF, Pentium G620, 8GB, 2x1000GB 2.5" Raid1, WLAN, Ubuntu 12.04 @22W
    TV: Panasonic P50G30

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!