an Variable anhängen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

an Variable anhängen

Beitrag von latenite » 21.08.2009 01:45:09

Hallo Leute

wie kann ich einer Variable einen neuen "String" anhängen? So das zum Bsp. aus x=1 dann x=1,2 und dann x=1,2,3 wird?

Code: Alles auswählen

#!/bin/bash
Y=0
while [ $Y -le 10 ]
do
	Y=$((Y+1))
	X=$Y
	X=$((X+1))
	echo $X
	X="$X,$((X+1))"
done
echo $X
sollte 1,2,3,4,5,6,7,8,9,10 ausgeben..tut s aber nicht. :(

danke für die Hilfe :)

Benutzeravatar
armin
Beiträge: 2682
Registriert: 17.03.2005 11:49:14

Re: an Variable anhängen

Beitrag von armin » 21.08.2009 02:03:02

Du solltest einfach die Variable X nicht jedes Mal komplett neu überschreiben X=$Y, dann bleiben dir auch mehr als die letzten beiden Werte erhalten.
Formerly known as Trigger.
HP 8510p - Debian Sid
Mitglied des Debian-KDE-Teams

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: an Variable anhängen

Beitrag von Duff » 21.08.2009 07:48:56

Oder alles in ein Array pushen und dieses dann ausgeben.
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9267
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: an Variable anhängen

Beitrag von Meillo » 21.08.2009 10:01:07

In 'ner Schleife ohne Berechnungen von Zahlen:

Code: Alles auswählen

#!/bin/sh
r="1"
for i in `seq 2 10` ; do
        r=$r,$i
done
echo $r
Oder mal etwas kreativer ... hier einige Versuche das Problem kürzstmöglich zu lösen:

Code: Alles auswählen

seq 10 | tr '\n' , | sed 's/,$//'
(das Newline am Ende fehlt)

Code: Alles auswählen

seq -s, -t\\n 10|sed 's/,$//'
(valide, 28 Zeichen lang)

Code: Alles auswählen

seq -s, 9;echo 10
(bedarf leider 9 und 10, 17 Zeichen lang)

... und ich probiere rum und finde einfach nichts kürzeres. Dann versuche ich es aber mal auf Debian GNU/Linux (statt NetBSD) und stelle fest, dass dort `seq' keinen Separator am Ende anhängt. Somit ist das meine kürzeste Lösung (seq 5.97 aus den GNU Coreutils).

Code: Alles auswählen

seq -s, 10
(10 Zeichen lang)
Das kriegt wohl niemand noch kürzer hin.

Wer aber noch eine kürzere Lösung weiß die _ohne_ das GNU seq auskommt, dann her damit!

Um noch die Unterschiede der `seq' zu zeigen:

Code: Alles auswählen

$ seq -s, 10 | od -c
0000000    1   ,   2   ,   3   ,   4   ,   5   ,   6   ,   7   ,   8   ,
0000020    9   ,   1   0   ,                                            
0000025
(das war NetBSD seq -- macht was korrekt ist)

Code: Alles auswählen

$ seq -s, 10 | od -c
0000000   1   ,   2   ,   3   ,   4   ,   5   ,   6   ,   7   ,   8   ,
0000020   9   ,   1   0  \n
0000025
(und das GNU seq -- macht was man meist will)
Use ed once in a while!

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: an Variable anhängen

Beitrag von latenite » 21.08.2009 12:33:37

@ Maillo seq -s, 10 war genau das was ich brauchte. Tja ich wusste gar nicht das es seq gibt (woher auch? = ernst gemeinte Frage). Danke für diese tolle Lösung.
Ich stehe noch voll in den Kinderschuhen was das Scripting angeht und du hast mir hier schon oft gut geholfen. Danke dafür :D

Benutzeravatar
Meillo
Moderator
Beiträge: 9267
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: an Variable anhängen

Beitrag von Meillo » 21.08.2009 12:45:56

latenite hat geschrieben:@ Maillo
Meillo
Tja ich wusste gar nicht das es seq gibt (woher auch? = ernst gemeinte Frage).
`seq' ist kein Standard Unix-Programm. Es kommt von Plan9, ist aber inzwischen sehr weit verbreitet (weil es in den GNU Coreutils enthalten ist). Deshalb trifft das jetzt nicht auf `seq' zu, aber für alles andere ist http://en.wikipedia.org/wiki/List_of_Unix_utilities ein guter Einstiegspunkt.

Du musst ja nur Programmnamen wissen, dann kannst du in der Manpage nachlesen.

Code: Alles auswählen

man -k searchstring
und

Code: Alles auswählen

dpkg -L coreutils | grep /usr/share/man
sind sicher auch interessant.
du hast mir hier schon oft gut geholfen. Danke dafür :D
Jedes Mal gerne. :-D
Use ed once in a while!

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: an Variable anhängen

Beitrag von latenite » 21.08.2009 13:03:17

@ Meillo Mit der Ausgabe von "seq -s, 10" hatte ich eigendlich vor die "-mtime" falg von "find" zu füttern...

Code: Alles auswählen

mtimecount=`$(seq -s, $(backupcount))`
echo $mtimecount
find $DIRS -mtime $mtimecount -exec cp -vp --parent {} $BACKUPDIR/backup_no_$(backupcount)_$date \;
leider ist schon beim echo schluss und find sagt: find: Ungültiges Argument cp für "-mtime".

Ich glaube ich habe die ` und ' und $() noch nicht ganz verstanden?! Korrigiert mich wenn ich falsch liege...

` - führt die `eingeschlossene` Befehlsfolge aus und ersetzt deren Ausgabe mit der eigendlichen Befehlsfolge
$() - führt die `eingeschlossene` Befehlsfolge aus und ersetzt deren Ausgabe mit der eigendlichen Befehlsfolge (ok?!??)
' - maskiert einfach alles
" - maskiert alles ausser $ und \

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: an Variable anhängen

Beitrag von latenite » 21.08.2009 13:16:06

das find argumnet -mtime scheint eine Eingabe von z,B 1,2,3,4 gar nicht zu akzeptieren.
Ich könnte schwüren ich habe gestern "find /home -mtime 1,2 -print" mal ausprobiert und es ging??? KOMISCH?!!

Was ich versuche ist: ALLE vor x-Tageb geänderten Datein zu finden. Wenn ich nur -mtime $x angebe dann findet find leider nur die EXAKT x Tage alten datein ich will aber auch alle die 9,8,7....0 Tage alt sind aufgelistet bekommen.... :cry:

Danke

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Re: an Variable anhängen

Beitrag von Spasswolf » 21.08.2009 13:17:46

mtime frisst keine Kommalisten.
Du suchst eventuell:

Code: Alles auswählen

find $DIR -mtime +0 -mtime -10

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: an Variable anhängen

Beitrag von latenite » 21.08.2009 14:44:50

ok anders gefragt: wie lasse ich find alle Datein anzeigen die zwei drei und vier Tage alt sind aber nicht die die null einen und älter als fünf sind?

find ./ -mtime +2 -mtime -5

geht nicht?
heist doch aber finde alle in ./ die älter als 2 Tage und nicht alter als 5 Tage sind? ODER?!

danke

Benutzeravatar
Meillo
Moderator
Beiträge: 9267
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: an Variable anhängen

Beitrag von Meillo » 21.08.2009 15:03:40

latenite hat geschrieben:ok anders gefragt: wie lasse ich find alle Datein anzeigen die zwei drei und vier Tage alt sind aber nicht die die null einen und älter als fünf sind?
Zugegeben, find ist nicht trivial und find(1) auch nicht die beste Manpage, aber Spasswolf hat die Lösung eigentlich schon geliefert, die du mit ein bisschen Testen auf deine Daten anpassen kannst.

Ich will dir jetzt nicht einfach 'ne fertige Lösung zum Kopieren hinklatschen, stattdessen erkläre ich was Spasswolf geliefert hat.

-mtime schaut nach der Zeit der letzten Änderung (das was du bestimmt willst)
Eine Zahl ohne Vorzeichen dahinter sagt: vor genau so vielen Tagen (-mtime 1 heißt Gestern)
Eine Zahl mit Plus sagt: vor mehr als sovielen Tagen (-mtime 0 heißt älter als Heute)
Eine Zahl mit Minus sagt: vor weniger als sovielen Tagen (-mtime 8 heißt diese Woche)

Jetzt musst du nur noch kombinieren und testen ob es auch wirklich so ist.

btw: zum Testen entweder /var/log nehmen (da hast du vermutlich schon geeigente Zeiten) oder mit `touch' geeigenete mtimes generieren.
btw2: `ls -ltr' ist bei sowas recht nützlich.


EDIT (nachdem dein Post nur ergänzt wurde):
latenite hat geschrieben:find ./ -mtime +2 -mtime -5

geht nicht?
Wieso nicht? Bei mir geht das wunderbar, bis auf, dass es AFAIK `+1' statt `+2' heißen sollte.
Use ed once in a while!

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: an Variable anhängen

Beitrag von latenite » 21.08.2009 16:29:09

ja ich hatte mich um 1 verrechnet und auch ein dummes directory (mit zuuuu vielen Einträgen) zum testen gewählt.
der tip mit /var/log und ein wenig probieren hat mir geholfen die -mtime option zu verstehen:

Code: Alles auswählen

0:631:root@x301 /home/kai/Desktop [0]# find /var/log/ -mtime 0 ; find /var/log/ -mtime 0 | wc -l
/var/log/
/var/log/Xorg.0.log.old
/var/log/auth.log
/var/log/fsck/checkfs
/var/log/fsck/checkroot
/var/log/apache2/access.log
/var/log/apache2/error.log
/var/log/kern.log
/var/log/ConsoleKit/history
/var/log/dmesg
/var/log/Xorg.0.log
/var/log/exim4/mainlog
/var/log/cups/access_log
/var/log/gdm
/var/log/gdm/:0.log
/var/log/syslog
/var/log/daemon.log
/var/log/messages
/var/log/wtmp
/var/log/user.log
/var/log/debug
21
0:632:root@x301 /home/kai/Desktop [0]# find /var/log/ -mtime 1 ; find /var/log/ -mtime 1 | wc -l
/var/log/pm-powersave.log
/var/log/gdm/:0.log.2
/var/log/gdm/:0.log.1
/var/log/pm-suspend.log
/var/log/dmesg.0
5
0:633:root@x301 /home/kai/Desktop [0]# find /var/log/ -mtime 2 ; find /var/log/ -mtime 2 | wc -l
/var/log/aptitude
/var/log/apt/term.log
/var/log/dpkg.log
3
0:634:root@x301 /home/kai/Desktop [0]# find /var/log/ -mtime 3 ; find /var/log/ -mtime 3 | wc -l
0
0:635:root@x301 /home/kai/Desktop [0]# find /var/log/ -mtime 4 ; find /var/log/ -mtime 4 | wc -l
/var/log/dmesg.1.gz
1
0:636:root@x301 /home/kai/Desktop [0]# find /var/log/ -mtime 5 ; find /var/log/ -mtime 5 | wc -l
0
0:637:root@x301 /home/kai/Desktop [0]# find /var/log/ -mtime 6 ; find /var/log/ -mtime 6 | wc -l
/var/log/mail.log
/var/log/btmp
/var/log/mail.err
/var/log/dmesg.3.gz
/var/log/exim4/paniclog
/var/log/mail.warn
/var/log/gdm/:0.log.3
/var/log/gdm/:0.log.4
/var/log/mail.info
/var/log/dmesg.2.gz
10
0:638:root@x301 /home/kai/Desktop [0]# find /var/log/ -mtime -6 | wc -l
30
0:639:root@x301 /home/kai/Desktop [0]# find /var/log/ -mtime +1 -mtime -5 | wc -l
4
0:640:root@x301 /home/kai/Desktop [0]# find /var/log/ -mtime +1 -mtime -5 | find /var/log/ -mtime +1 -mtime -5 | wc -l
4
0:641:root@x301 /home/kai/Desktop [0]# find /var/log/ -mtime +1 -mtime -5 ; find /var/log/ -mtime +1 -mtime -5 | wc -l
/var/log/aptitude
/var/log/dmesg.1.gz
/var/log/apt/term.log
/var/log/dpkg.log
4
0:642:root@x301 /home/kai/Desktop [0]# find /var/log/ -mtime +1 -mtime -5 ; find /var/log/ -mtime +0 -mtime -5 | wc -l
/var/log/aptitude
/var/log/dmesg.1.gz
/var/log/apt/term.log
/var/log/dpkg.log
9
0:643:root@x301 /home/kai/Desktop [0]# find /var/log/ -mtime +0 -mtime -5
/var/log/aptitude
/var/log/dmesg.1.gz
/var/log/pm-powersave.log
/var/log/apt/term.log
/var/log/gdm/:0.log.2
/var/log/gdm/:0.log.1
/var/log/dpkg.log
/var/log/pm-suspend.log
/var/log/dmesg.0
0:644:root@x301 /home/kai/Desktop [0]#
danke *DANKE* danke :D

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: an Variable anhängen

Beitrag von Duff » 21.08.2009 17:05:45

Bei der Auflistung hättest du noch ein ls -lrt in die find-Ausgabe einbauen können. Dann sieht man zumindestens den Zeitstempel der Dateien ;-)

Code: Alles auswählen

 find /var/log/ -mtime 5 |xargs ls -lrt 
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9267
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: an Variable anhängen

Beitrag von Meillo » 21.08.2009 17:15:48

Duff hat geschrieben:

Code: Alles auswählen

 find /var/log/ -mtime 5 |xargs ls -lrt 
Ach, ich verwende viel zu selten `xargs' ...
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: an Variable anhängen

Beitrag von Duff » 21.08.2009 17:37:16

Bei find und -exec ls -lrt {} \; wird die Liste nicht richtig sortiert.
Oh, yeah!

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: an Variable anhängen

Beitrag von latenite » 22.08.2009 00:32:34

wisst ihr warum das directory nicht mit copiert wird? obwohl find es ja nun eindeutig findet!

Code: Alles auswählen

0:551:root@x301 /home/kai/Desktop [0]# mkdir /home/kai/Desktop/1234567
0:552:root@x301 /home/kai/Desktop [0]# touch /home/kai/Desktop/12345678
0:553:root@x301 /home/kai/Desktop [0]# find /home/kai/Desktop/ -mmin +0 -mmin -1 -print
/home/kai/Desktop/
/home/kai/Desktop/12345678
/home/kai/Desktop/1234567
0:554:root@x301 /home/kai/Desktop [0]# find /home/kai/Desktop/ -mmin +0 -mmin -1 -print -exec cp -vp --parent {} /lvdata/backupdir/test \;
/home/kai/Desktop/
cp: Verzeichnis „/home/kai/Desktop/“ ausgelassen
/home/kai/Desktop/12345678
„/home/kai/Desktop/12345678“ -> „/lvdata/backupdir/test/home/kai/Desktop/12345678“
/home/kai/Desktop/1234567
cp: Verzeichnis „/home/kai/Desktop/1234567“ ausgelassen
0:555:root@x301 /home/kai/Desktop [0]# 
0:556:root@x301 /home/kai/Desktop [0]# ls -la /lvdata/backupdir/test/home/kai/Desktop/
insgesamt 0
drwxrwxrwx 2 kai  kai  21 22. Aug 00:10 .
drwxr-xr-x 3 kai  kai  20 21. Aug 20:27 ..
-rw-r----- 1 root root  0 22. Aug 00:10 12345678
0:557:root@x301 /home/kai/Desktop [0]# 
warum hat des das dir 1234567 nicht kopiert?

danke

Benutzeravatar
Meillo
Moderator
Beiträge: 9267
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: an Variable anhängen

Beitrag von Meillo » 22.08.2009 11:40:12

latenite hat geschrieben:wisst ihr warum das directory nicht mit copiert wird?
weil `-r' fehlt. `cp' kopiert keine Verzeichnisse wenn kein `-r' angegeben ist.
Use ed once in a while!

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: an Variable anhängen

Beitrag von latenite » 22.08.2009 14:04:02

aber wenn ich die recursiv Flagge setze dann wird mehr kopiert als ich will (um nicht zu sagen alles was unter /home/kai/Desktop liegt).
Damit hebel ich ja meine zuvor definierte findabfrage vollkommen aus...

Code: Alles auswählen

0:506:root@x301 /home/kai [0]# find /home/kai/Desktop/ -mmin +0 -mmin -1 -print -exec cp -vp --parent {} /lvdata/backupdir/test \;
/home/kai/Desktop/
cp: Verzeichnis „/home/kai/Desktop/“ ausgelassen
/home/kai/Desktop/dir_1
cp: Verzeichnis „/home/kai/Desktop/dir_1“ ausgelassen
0:507:root@x301 /home/kai [0]# find /home/kai/Desktop/ -mmin +0 -mmin -1 -print -exec cp -vpr --parent {} /lvdata/backupdir/test \;
/home/kai/Desktop/
„/lvdata/backupdir/test/home/kai/Desktop/vm_bridge“ entfernt
„/home/kai/Desktop/vm_bridge“ -> „/lvdata/backupdir/test/home/kai/Desktop/vm_bridge“
„/lvdata/backupdir/test/home/kai/Desktop/data“ entfernt
„/home/kai/Desktop/data“ -> „/lvdata/backupdir/test/home/kai/Desktop/data“
„/home/kai/Desktop/scriplets/show_files_of_last_X_days.sh“ -> „/lvdata/backupdir/test/home/kai/Desktop/scriplets/show_files_of_last_X_days.sh“
„/home/kai/Desktop/scriplets/dif_in_min.sh“ -> „/lvdata/backupdir/test/home/kai/Desktop/scriplets/dif_in_min.sh“
„/home/kai/Desktop/scriplets/bash_while.sh“ -> „/lvdata/backupdir/test/home/kai/Desktop/scriplets/bash_while.sh“
„/home/kai/Desktop/scriplets/for_down_frage.sh“ -> „/lvdata/backupdir/test/home/kai/Desktop/scriplets/for_down_frage.sh“
„/home/kai/Desktop/scriplets/backup.sh“ -> „/lvdata/backupdir/test/home/kai/Desktop/scriplets/backup.sh“
„/home/kai/Desktop/scriplets/name_cp.sh“ -> „/lvdata/backupdir/test/home/kai/Desktop/scriplets/name_cp.sh“
„/home/kai/Desktop/scriplets/name_cp_2.sh“ -> „/lvdata/backupdir/test/home/kai/Desktop/scriplets/name_cp_2.sh“
„/home/kai/Desktop/rules_to_life_“ -> „/lvdata/backupdir/test/home/kai/Desktop/rules_to_life_“
„/lvdata/backupdir/test/home/kai/Desktop/temp“ entfernt
„/home/kai/Desktop/temp“ -> „/lvdata/backupdir/test/home/kai/Desktop/temp“
....
....
....
....

was ich will ist: das alles (jedes Verzeichnis, jede datei, ob leer oder nicht) was "find" dank der -mmin Flaggen findet (aber auch NICHT mehr) auch zu kopieren.
Was mache ich das falsch?

Danke

p.s. @ Maillo alles *schick* mit dem bashpromt jetzt? :)

Antworten