shell script Frage(n) ( ash )

Schlaubi666

Neuer User
Mitglied seit
18 Mai 2005
Beiträge
121
Punkte für Reaktionen
0
Punkte
0
ich versuche etwas in ash zu programmieren.

ich versuche alle *.sh in einem dir in ein array einzulesen, aber irgendwie fkt. das nicht, aber in meinem linux schon.

Code:
hoster1=$( ls *.sh)
hoster2=($(ls *.sh))

hoster1 fkt. in linux + fritzbox -> ist aber nicht das was ich will -> ist kein array
hoster2 fkt. nur in linux , leider nicht auf der fritzbox
es kommt nur der Fehler:

Code:
-sh: syntax error: "(" unexpected


wer kann mir da helfen ?
 
Zuletzt bearbeitet:
Die Busybox Shell kann keine Arrays. Da hilft nur eine andere Shell.

Jörg
 
array ersatz ?

wie kann ich das umbauen ?

hosts=( a b c d)

und dann möchte ich in einer schleife durch dir Liste( Strings durch Space getrennt)

aber wie ???
 
Zuletzt bearbeitet:
Wenn du dir sicher sein kannst, dass deine Dateinamen keine Leerzeichen enthalten, kannst du auch mit deinem $hoster1 arbeiten:
Code:
hoster1=$(ls *.sh)
for file in $hoster1; do echo $file; ...; done
Natürlich könnte man das in diesem Fall direkter machen (in diesem Fall sind Leerzeichen kein Problem):
Code:
for file in *.sh; do echo $file; ...; done
Ansonsten gibt es in ash genau eine Array-artige Variable, die man missbrauchen kann, wenn man unbedingt muss:
Code:
set -- *.sh
for file in "$@"; do echo $file; ...; done
Gruß

Andreas
 
danke, habe nicht gedacht das es so einfach ist.
 
Zuletzt bearbeitet:
if Vergleich

neues Problem:
ich wöchte etwas tun, wenn eine date > 0 byte ist

Code:
size=$(du $file | awk '{print $1}')
echo "size: $size"
if  [ $size > 0 ]
then
 echo "> 0 byte"
 ls -l $file
else
 echo "= 0 byte"
 ls -l $file
fi

das fkt. aber nicht da $size offensichtlich keine Zahl ist sondern ein Sting.

Bitte um Hilfe.
 
Zuletzt bearbeitet:
Nö, ich denke, du fragst nur falsch ;-). Benutze doch lieber
Code:
if  [ $size [B]-gt[/B] 0 ]
 
ja, so gehts

danke.

Code:
z1=12
z2=9
if [ $z1 > $z2 ]
then
    echo "$z1 ist groesser als $z2."
else
    echo "$z1 ist kleiner oder gleich $z2."
fi

aber mit reinen Zahlen geht >, wo liegt der Unterschied ?
 
">" ist hier wie sonst auch die Umleitung der Standardausgabe; schau mal nach, du hast so die Datei "9" im aktuellen Verzeichnis erstellt.

Was übrig bleibt ist "[ 12 ]" und das ist wahr, weil der String "12" nicht die Länge Null hat.

Es ist in deinem Beispiel also mehr oder weniger Zufall, dass der richtige Zweig ausgeführt wurde.

Andreas
 
ja genau, ok ich glaube ich habe es kappiert.

Danke

P.S: das stand aber so in einen Tutorial !!! Wer kennt da ein gutes ?
 
Zuletzt bearbeitet:
sed Frage

ich möchte Zeilen die $h enthalten, aus einem File löschen

so geht es
Code:
sed -e /$h/d $tmpdir/$file > $tmpdir/$tmp
mv $tmpdir/$tmp $tmpdir/$file

wenn ich es direkt versuche

Code:
sed -e /$h/d $tmpdir/$file > $tmpdir/$file

ist das file danach immer 0 byte


was mache ich da falsch, den Umweg über das tmp-file mag ich überhaupt nicht !!!
 
Aus
Code:
/var/tmp # sed --help
BusyBox v1.12.4 (2009-01-18 14:51:32 CET) multi-call binary

Usage: sed [-efinr] pattern [files...]

Options:
        -e script       Add the script to the commands to be executed
        -f scriptfile   Add scriptfile contents to the
                        commands to be executed
        [B]-i              Edit files in-place[/B]
        -n              Suppress automatic printing of pattern space
        -r              Use extended regular expression syntax

If no -e or -f is given, the first non-option argument is taken as the sed
script to interpret. All remaining arguments are names of input files; if no
input files are specified, then the standard input is read. Source files
will not be modified unless -i option is given.
folgt:
Code:
 sed -i "/$h/d" $tmpdir/$file

Wichtig ist dabei, dass $h nicht leer ist, sonst ist es danach auch dein Ergebnis...

Jörg
 
sed

danke, das habe ich gesucht

wie kann ich das besser coden ??? man kann doch bestimmt die sed's zusammenfassen, oder ???
Code:
echo $zeile | sed s/td//g | sed s/tr//g | sed s/\<//g | sed s/\>//g
 
Zuletzt bearbeitet:
Code:
echo $zeile | sed 's/td//g;s/tr//g;s/<//g;s/>//g'

ohne "\" -> dann klappts

Danke
 
Zuletzt bearbeitet:
awk

Code:
Jahr=$(date +"%Y") 
# temp1 = Vox/Di 02.06.//11.10 Uhr//11.40 Uhr/Nachhilfe(1.10)//                                                         
echo $temp1|awk -F"/" '{print $2}'|awk '{print $2}'|awk -F"." '{print "[b]$Jahr[/b]."$2"."$1 }'

die Ausgabe einer Variable in das print vom awk bekomme ich nicht hin. Bitte helft mir. Kann ich aus hier irgendwie die awk's zusammenfassen ?
rauskommen soll:

2009.06.02
 
Hallo Schlaubi666,

genügt dir das nicht?
Code:
# date -I
2009-06-01
#
Die Bindestriche kanns du ja noch mittels sed gegen Punkte austauschen.

Joe
 
geht
Code:
/var/mod/root # temp1="Vox/Di 02.06.//11.10 Uhr//11.40 Uhr/Nachhilfe(1.10)//"
/var/mod/root # date +"%Y"$(echo $temp1 | sed 's%^.*\([0-9][0-9]\)\.\([0-9][0-9]\).//.*%.\2.\1%')
2009.06.02
Oder (wenn $Jahr bleiben soll)
Code:
echo $temp1 | sed "s%^.*\([0-9][0-9]\)\.\([0-9][0-9]\).//.*%$Jahr.\2.\1%"
Das wird übrigens ohne weitere Abfrage zum Jahreswechsel Probleme machen, wenn der Termin Ende Dezember zwei Wochen in der Zukunft liegt ...

Jörg
 
Zuletzt bearbeitet:
@Joe_57:
du hast das Problem leider nicht erkannt

@MaxMuster:
fkt. aber verstanden habe ich es noch nicht ganz ...

die reg.ex (^.*\([0-9][0-9]\)\.\([0-9][0-9]\).//.*) ja ,
die Ausgabe ($Jahr.\2.\1) auch, aber
was macht s% ... % ...% ???


ich habe ja noch etwas Zeit zum Jahreswechsel ;-) aber ich bin aufgeschlossen für Tips ...
 
s%such%ersetz% ist genauso, wie s/such/ersetz/ nur halt praktischer, wenn man Dateinamen oder sowas wie du hast untersuchen will, weil man bei der ersten Variante die "/" im String nicht maskieren muss ;-).
(das Zeichen hinter dem s wird zum separieren der Teile genutzt, es ginge also auch s#such#ersetz# usw.)

Jörg
 
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.