substring in shell script

SCHASCH

Neuer User
Mitglied seit
12 Jan 2007
Beiträge
7
Punkte für Reaktionen
0
Punkte
0
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
 
Zuletzt bearbeitet:
>Ja, die Busybox von Freetz kann das.
Danke RalfFriedl


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

MfG
schasch
 
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
 
Zuletzt bearbeitet:
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
 
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
 
Das klappt auch mit der normalen busybox [1] (siehe untenstehendes kleines Testscript: t=${txt1:$l:1} )
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
 
@RalfFriedl
danke

INFO:geht auch nur mit der freetz-BB-sh
 
SCHASCH schrieb:
INFO:geht auch nur mit der freetz-BB-sh
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
 
Zuletzt bearbeitet:
Super Lösungen!!

Danke euch beiden!
 
Danke euch beiden!
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
 
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

ja, richtig verstanden! Als ich den Thread gestartet hatte, hatte ich noch keine freetz-BB-bin.

..aber danke euch beiden für die Hilfe!
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.