.titleBar { margin-bottom: 5px!important; }

substring in shell script

Dieses Thema im Forum "FRITZ!Box Fon: Modifikationen" wurde erstellt von SCHASCH, 10 Jan. 2012.

  1. SCHASCH

    SCHASCH Neuer User

    Registriert seit:
    12 Jan. 2007
    Beiträge:
    7
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    #1 SCHASCH, 10 Jan. 2012
    Zuletzt bearbeitet: 10 Jan. 2012
    Hallo,


    ich setzt 7170 mit 29.04.87 version ein und lese Daten über eine pl2303 adapter ein.
    (Kernel modul von freetz geladen in die normal firmware)

    Das script läuft auf meinem Ubuntu gut.

    Habe das Problem dass mein script.sh nicht läuft und ich weiss nicht wie ich ein substring auswerten kann.

    #echo "--->read from $SERIALPORT..."
    SERIAL_INPUT="";
    while read SERIAL_INPUT
    do
    #echo "test"
    #LENNR_RECIEVED=`echo $SERIAL_INPUT |wc -c`;
    #READVAL_SERIAL=${SERIAL_INPUT:0:7}
    #READVAL_SERIAL=substr($SERIAL_INPUT,0,7)

    echo "->$SERIAL_INPUT"
    break
    done <$SERIALPORT

    Wie kann ich das mit diesem substring "
    READVAL_SERIAL=${SERIAL_INPUT:0:7}" realisieren?
    Kann die busybox(sh) von freetz das?


    FEHLER:
    seriell_auslesen.sh: line xy: syntax error: Bad substitution

    MfG
    schasch
     
  2. RalfFriedl

    RalfFriedl IPPF-Urgestein

    Registriert seit:
    22 Apr. 2007
    Beiträge:
    12,343
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ja, die Busybox von Freetz kann das.

    Und bitte für Programme CODE-Tags verwenden.
     
  3. SCHASCH

    SCHASCH Neuer User

    Registriert seit:
    12 Jan. 2007
    Beiträge:
    7
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    >Ja, die Busybox von Freetz kann das.
    Danke RalfFriedl


    >Und bitte für Programme CODE-Tags verwenden.
    OK, sorry!

    MfG
    schasch
     
  4. Bejobe

    Bejobe Neuer User

    Registriert seit:
    19 Mai 2005
    Beiträge:
    163
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    #4 Bejobe, 11 Jan. 2012
    Zuletzt bearbeitet: 11 Jan. 2012
    Das klappt auch mit der normalen busybox [1] (siehe untenstehendes kleines Testscript: t=${txt1:$l:1} )
    Code:
    #!/bin/sh
    txt1="abcdefghij"
    txt2=""
    echo "$txt1"
    i=0
    len=${#txt1}
    while [ $i -le $len ]; do
      l=`expr $len - $i`
      t=${txt1:$l:1}
      txt2=$(echo "$txt2$t")
      i=`expr $i + 1`
    done
    echo "$txt2"
    Bejobe

    [1] Der aktuellen Labor-FW der FB 7270
     
  5. SCHASCH

    SCHASCH Neuer User

    Registriert seit:
    12 Jan. 2007
    Beiträge:
    7
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi Bejobe,

    nein leider nicht. expr ist in der FB-busybox(29.04.87) nicht drin.
    # e[TAB]
    echo egrep email.plugin env ether-wake eventadd eventsdump
    #

    ...Aber in der freetz-BB is expr drin, funktioniert dann auch mit einem symlink auf z.B./var/expr

    DANKE
     
  6. Bejobe

    Bejobe Neuer User

    Registriert seit:
    19 Mai 2005
    Beiträge:
    163
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    29.04.87 ist wohl von der 7170? Ja, das wird so sein, dass die busybox dort leider nur mit weniger Features vorhanden ist. Wobei aber "expr" für mein Beispiel Test-Script natürlich eigentlich unwichtig ist. Wichtig ist darin hier ja nur die Zeile t=${txt1:$l:1}, wobei man $l auch durch eine feste Zahl ersetzen kann. Aber das klappt wohl auch nicht. Ich habe auf der 7170 irgendwie anders abgeholfen... (IIRC mit sed) werde das mal heraussuchen.

    Bejobe
     
  7. SCHASCH

    SCHASCH Neuer User

    Registriert seit:
    12 Jan. 2007
    Beiträge:
    7
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    das wäre super
     
  8. RalfFriedl

    RalfFriedl IPPF-Urgestein

    Registriert seit:
    22 Apr. 2007
    Beiträge:
    12,343
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Warum so kompliziert und langsam?
    Code:
    # cat /tmp/test.sh
    #!/bin/sh
    txt1="abcdefghij"
    txt2=""
    echo "$txt1"
    i=0
    len=${#txt1}
    while [ $i -le $len ]; do
      l=`expr $len - $i`
      t=${txt1:$l:1}
      txt2=$(echo "$txt2$t")
      i=`expr $i + 1`
    done
    echo "$txt2"
    
    # time sh /tmp/test.sh
    abcdefghij
    jihgfedcba
    real    0m 1.16s
    user    0m 0.18s
    sys     0m 0.92s
    
    Es geht auch so, und expr braucht man auch nicht:
    Code:
    # cat /tmp/test2.sh
    #!/bin/sh
    txt1="abcdefghij"
    txt2=""
    echo "$txt1"
    i=${#txt1}
    while [ $i -gt 0 ]; do
      i=$((i - 1))
      txt2="$txt2${txt1:$i:1}"
    done
    echo "$txt2"
    
    # time sh /tmp/test2.sh
    abcdefghij
    jihgfedcba
    real    0m 0.03s
    user    0m 0.01s
    sys     0m 0.02s
    
     
  9. SCHASCH

    SCHASCH Neuer User

    Registriert seit:
    12 Jan. 2007
    Beiträge:
    7
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    @RalfFriedl
    danke

    INFO:geht auch nur mit der freetz-BB-sh
     
  10. Bejobe

    Bejobe Neuer User

    Registriert seit:
    19 Mai 2005
    Beiträge:
    163
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    #10 Bejobe, 11 Jan. 2012
    Zuletzt bearbeitet: 11 Jan. 2012
    Das stimmt, weil eben auch txt2="$txt2${txt1:$i:1}" nicht geht auf der 7170.

    Das Folgende geht aber - auch mit der Busybox der 7170 (ersetzt "txt2=${txt1:$von:$anz}" mit hilfe von sed):
    Code:
    #!/bin/sh
    #-------------------
    txt1="abcdefghij"
    echo "$txt1"
    #-------------------
    #entspricht: txt2=${txt1:$von:$anz}
    von=1 # 1. Zeichen = 0
    anz=5 # 
    #-------------------
    len=${#txt1}
    bis=$((len - von - anz ))
    txt2=$(echo "$txt1" | sed -e "s/^.\{$von\}//" | sed -e "s/.\{$bis\}$//" )
    #-------------------
    echo "$txt2"
    
    HTH

    Bejobe
     
  11. SCHASCH

    SCHASCH Neuer User

    Registriert seit:
    12 Jan. 2007
    Beiträge:
    7
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Super Lösungen!!

    Danke euch beiden!
     
  12. Bejobe

    Bejobe Neuer User

    Registriert seit:
    19 Mai 2005
    Beiträge:
    163
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Euch beiden? Es ergab sich doch im Laufe des Threads, dass du das Script auf einer FB 7170 laufen lassen willst, da geht das von RalfFriedl nicht... Oder habe ich es falsch verstanden?

    Bejobe
     
  13. SCHASCH

    SCHASCH Neuer User

    Registriert seit:
    12 Jan. 2007
    Beiträge:
    7
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    ja, richtig verstanden! Als ich den Thread gestartet hatte, hatte ich noch keine freetz-BB-bin.

    ..aber danke euch beiden für die Hilfe!