String an shell script übergeben

Hi !

Ich weiß nicht genau ob ich hier richtig bin, ich probiers mal.
Ich schreibe gerade mein erstes shell script. Das script liegt im Verzeichnis VZ1. Ich möchte dem script einen string übergeben, der Teil von Dateinamen ist, die im Unterverzeichnis VZ1/VZ2 liegen.
Z.B. möchte ich das script aufrufen mit test* und das script soll dann alle Dateien in VZ1/VZ2 finden bei denen test im Dateinamen vorkommt. Alle Dateien in VZ2 haben die Endung .dat sollen aber ohne diese Endung ausgegeben werden.
Ich habe folgendes versucht:

names="$1";
cd VZ2;
for filename in $names; do
 echo "$( basename $filename .dat )";
done

Anscheinend werden aber beim Aufruf des scripts mit test* schon alle Dateinamen aus VZ1 in $1 geschrieben die test im Dateinamen enthalten. Wie erhalte ich den reinen string der dem script übergeben wurde ?

Viele Grüße

hendrik

Hallo Hendrik

names="$1";
cd VZ2;
for filename in $names; do
echo „$( basename $filename .dat )“;
done

Anscheinend werden aber beim Aufruf des scripts mit test*
schon alle Dateinamen aus VZ1 in $1 geschrieben die test im
Dateinamen enthalten. Wie erhalte ich den reinen string der
dem script übergeben wurde ?

Dein obiges Skript wird nur den _ersten_ Dateinamen, der auf „test*“ passt, weiterverarbeiten, da du $names nur $1 zuweist.

Willst du $names _alle_ Dateinamen zuweisen, wäre $@ der Parameter deiner Wahl:

sam@box: ~ $ cat b
#!/bin/bash
echo "$(basename -s .dat $@ )"
exit 0
sam@box: ~ $ ls v2
testa.dat testc.dat teste.dat testg.dat
testb.dat testd.dat testf.dat
sam@box: ~ $ ./b v2/test\*
testa
testb
testc
testd
teste
testf
testg
sam@box: ~ $

HTH und Gruss
Sam

Hallo hendrik,

Das script liegt
im Verzeichnis VZ1. Ich möchte dem script einen string
übergeben, der Teil von Dateinamen ist, die im
Unterverzeichnis VZ1/VZ2 liegen.
Z.B. möchte ich das script aufrufen mit test* und das script
soll dann alle Dateien in VZ1/VZ2 finden bei denen test im
Dateinamen vorkommt. Alle Dateien in VZ2 haben die Endung .dat
sollen aber ohne diese Endung ausgegeben werden.
Ich habe folgendes versucht:

names="$1";
cd VZ2;
for filename in $names; do
echo „$( basename $filename .dat )“;
done

Wenn Du unbedingt diesen Aufruf haben möchtest, musst Du den Parameter in Anführungszeichen setzen, also

scriptname "test\*"

was natürlich fehleranfällig ist.

Viele Grüße
Marvin

Dein obiges Skript wird nur den _ersten_ Dateinamen, der auf
„test*“ passt, weiterverarbeiten, da du $names nur $1 zuweist.

Willst du $names _alle_ Dateinamen zuweisen, wäre $@ der
Parameter deiner Wahl:

Hi !

Danke für eure Antworten.
Wenn ich $@ verwende bekomme ich zwar alle Dateien die mit test anfangen, aber eben in dem Verzeichnis in dem das script liegt. Wie bekomme ich die Dateien die mit test anfangen und in einem Unterverzeichnis liegen, das muss doch irgendwie gehen ?
Gruß

hendrik

Hallo Hendrik,

Wenn ich $@ verwende bekomme ich zwar alle Dateien die mit
test anfangen, aber eben in dem Verzeichnis in dem das script
liegt.

Ja klar, weil dein Parameter test* vor dem Start des Skriptes zu den passenden Dateinamen erweitert wird. Sowas nennt sich globbing, bzw. Pfadnamenerweiterung. Davor werden noch andere Ersetzungen vorgenommen, die aber in deinem Fall zum Glück keine Rolle spielen:
http://www.nextop.de/lhb/node62.html

Wie bekomme ich die Dateien die mit test anfangen und
in einem Unterverzeichnis liegen, das muss doch irgendwie
gehen ?

Indem Du diese Erweiterung z.B. mit Anführungszeichen verhinderst. Es gibt noch andere Möglichkeiten, wie z.B. durch

set -o noglob

bzw. kürzer

set -f

http://books.google.com/books?id=Xb6RlkhMhfYC&pg=PA6…
was aber ein wenig veraltet ist und durch andere Maßnahmen ersetzt werden sollte. Gib ruhig mal

man bash

ein und studiere den Abschnitt „Pathname Expansion“.
Du kannst dieses Verhalten gut sehen, wenn Du dir deine Variable ausgeben lässt. Ich habe dein Skript mal an meine Verzeichnisse angepasst, aber sonst relativ unverändert gelassen:

#!/bin/bash
names="$1"
echo "NAMES: $names"
cd neu;
for filename in $names; do
echo $names
 echo "$( basename $filename .dat )";
done

Die Verzeichnisse sehen so aus:

kb@lenny:/tmp$ ls
alpha.dat lost+found orbit-kb seahorse-ZSEuwt v1
gconfd-kb mapping-kb pulse-kb test\_tmp.dat v1~
keyring-bFNxoP neu seahorse-KiaWC1 v



kb@lenny:/tmp$ ls neu
alpha.dat keintest.dat test1.dat test2.dat test3.dat

Wenn ich jetzt das Skript v so aufrufe:

./v test\*

wird test* zu test_tmp.dat erweitert (Globbing):

kb@lenny:/tmp$ ./v test\*
NAMES: test\_tmp.dat
test\_tmp.dat
test\_tmp

Mit diesem Aufruf

kb@lenny:/tmp$ ./v "test\*"

findet kein Globbing statt, so daß names tatsächlich den Wert test* erhält:

kb@lenny:/tmp$ ./v "test\*"
NAMES: test\*
test1.dat test2.dat test3.dat
test1
test1.dat test2.dat test3.dat
test2
test1.dat test2.dat test3.dat
test3

Ein Markieren mit Backslash wäre übrigens genauso erfolgreich:

kb@lenny:/tmp$ ./v test\*
NAMES: test\*
test1.dat test2.dat test3.dat
test1
test1.dat test2.dat test3.dat
test2
test1.dat test2.dat test3.dat
test3

Ich hoffe, dir ist jetzt klar, wo das Problem liegt. Wenn nicht, überlege dir nochmal genau, was die Zeile

for filename in $names; do

eigentlich genau macht.

Allerdings rühren die Schwierigkeiten mehr von der Aufgabenstellung her, das Ganze mittels eines Skriptes zu lösen. Für die Auflistung von Dateien (mit oder ohne Extension) in einem bekannten Unterverzeichnis bedarf es eigentlich keines Skriptes. Aber wahrscheinlich soll es ja auch mehr eine Übung sein.

Viele Grüße
Marvin

Hallo nochmal

Wenn ich $@ verwende bekomme ich zwar alle Dateien die mit
test anfangen, aber eben in dem Verzeichnis in dem das script
liegt. Wie bekomme ich die Dateien die mit test anfangen und
in einem Unterverzeichnis liegen, das muss doch irgendwie
gehen ?

Was spricht dagegen, dem Skript auch das Verzeichnis zu übergeben?

./deinskript [/]pfad/zum/vz2/test\*

Gruss
Sam

Allerdings rühren die Schwierigkeiten mehr von der
Aufgabenstellung her, das Ganze mittels eines Skriptes zu
lösen. Für die Auflistung von Dateien (mit oder ohne
Extension) in einem bekannten Unterverzeichnis bedarf es
eigentlich keines Skriptes. Aber wahrscheinlich soll es ja
auch mehr eine Übung sein.

Hi !

Das ganze ist keine Übung. Ich habe ein Programm was mit verschiedenen Daten aufgerufen werden kann. Diese Daten liegen als Dateien in einem DAT-Unterverzeichnis. Ich möchte nun ein script schreiben, so dass ich das Programm mit einigen ausgewählten Daten aufrufen kann.
Ich habs jetzt so gemacht, dass man praktisch DAT/test* an das script übergeben muss, das funktioniert.
Danke für eure Hilfe !

hendrik