ubuntuusers.de

Wie kann man einem Skript den Namen einer Datei übergeben?

Status: Gelöst | Ubuntu-Version: Ubuntu 24.04 (Noble Numbat)
Antworten |

Naubaddi

Avatar von Naubaddi

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 806

Hi,

gibt es eine Möglichkeit einem Skript einen Dateinamen in eine Variable zur Weiterverarbeitung zu übergeben?

So sieht mein Versuch aus:

1
2
read -p "Welche Datei?" avr_Datei
echo $avr_Datei

es funktioniert soweit das der Dateiname in die Variablen übernommen wird, mit "echo" wird der Dateiname auch korrekt ausgegeben. Leider werden weitere Aktionen mit der Variablen "$avr_Datei" ignoriert, bei dem Versuch die Datei an BASCOM weiterzugeben:

1
wine "$bascom" "$avr_Datei" auto

meint Bascom "es wurde keine Datei angegeben"

Grüßle, Naubaddi

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 305

Wohnort: Aachen

Moin,

genau wie bei einer Funktion, ist das erste übergebene Argument im Skript $1, das zweite $2 usw.

Also in deinem Skript entweder einfach...

1
wine "$bascom" "$1" auto

oder halt vorher das Argument in deine Variable schreiben...

1
2
avr_Datei="$1"
wine "$bascom" "$avr_Datei" auto

Dann halt dein Skript mit Dateipfad aufrufen...

1
"/pfad/zum/Skript.bash" "/pfad/der/Datei"

Gruß Thomas

Naubaddi

(Themenstarter)
Avatar von Naubaddi

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 806

Hi,

genau das mache ich ja, aber die Variable $1 ist leer, nix drin. Wenn es die letzten ca. 10 Jahre nicht funktioniert hätte würde ich den Fehler bei mir suchen.

Naubaddi

(Themenstarter)
Avatar von Naubaddi

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 806

Hi,

bei diesem kleinen Skript bleibt die Variable $avr_Datei leer als wurde nix übergeben, was mache ich falsch?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/bash
#
avr_Datei="$1"
#
funkt() {
#
echo $avr_Datei "<-- die Variable ist leer"
}
#
export -f funkt
gnome-terminal -- bash -c "funkt;read x"
#

Gastmarant

Anmeldungsdatum:
24. September 2025

Beiträge: 150

Nur Name oder kompletter Pfad?

1
2
3
4
5
6
7
8
9
#/bin/bash
avr_Datei=$1

funkt() {
echo "$1"
}

export -f funkt
gnome-terminal -- bash -c "funkt $avr_Datei;read x"

oder gleich:

1
2
3
4
5
6
7
8
#/bin/bash

funkt() {
echo "$1"
}

export -f funkt
gnome-terminal -- bash -c 'funkt "$1"; read x' _ "$1"

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 305

Wohnort: Aachen

Naubaddi schrieb:

bei diesem kleinen Skript bleibt die Variable $avr_Datei leer als wurde nix übergeben, was mache ich falsch?

Du exportierst die Funktion, damit sie in der anderen Session verfügbar ist, mit der Variable machst du das aber nicht.

1
export avr_Datei

Oder halt die Varianten von Gastmarant nehmen und den Wert erst im Aufruf an die Funktion übergeben.

Ich hoffe, im original ist nicht noch ein dudo vorhanden, denn sonst musst du noch anders vorgehen.

Naubaddi

(Themenstarter)
Avatar von Naubaddi

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 806

Hi,

es funktioniert jetzt Dank Eurer Hilfe und reichlich Programmzeilen und exotischen Befehlen im Skript, die da wären,

damit das Terminal offen bleibt:

1
2
3
4
5
6
7
8
9
#!/bin/bash
#
funkt() {
# --> hier steht das eigentliche Skript was unter Xubuntu einfach nur funktioniert <--
}
#
export -f funkt
gnome-terminal -- bash -c "funkt;read x"
#

die Zeilen damit der übergebene Pfad mit Dateinamen funktioniert:

1
2
3
4
echo "Welche Datei soll kompiliert werden?"
read -r Datei
dumm=${Datei%r*}'r'
avr_Datei='/'${dumm#*/}			# die avr_Datei ohne ' Zeichen

bei Xubuntu hätte ein einfaches "avr_Datei=$1" gereicht.

Grüßle, Naubaddi

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4784

Wohnort: Berlin

@Naubaddi: Ich sehe nicht wie das funktionieren soll. Wenn ich das in eine Datei schreibe und mir am Ende die Variable ausgeben lasse passiert das hier:

$ ./test.sh
Welche Datei soll kompiliert werden?
test.bas
>/test.basr<

Das r am Ende sollte da ja wohl eher nicht sein. Was denkst Du denn was diese komische Verrenkung bewirkt? Einfach avr_Datei=$1 reicht.

Naubaddi

(Themenstarter)
Avatar von Naubaddi

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 806

Hi,

ein einfaches " avr_Datei=$1" hat die letzten 10 Jahre gereicht, mit Ubuntu 24.04 funktioniert es nicht mehr, die Variable "$1" bleibt ohne Inhalt. Die Verrenkungen mache ich nicht zum Spaß, sondern weil Ubuntu 24.04 es nicht kann (schon oft erwähnt XUBUNTU kann es!).

Da "$1" nicht funktioniert wird mit "read" der Pfad/Dateiname übernommen, dabei sieht der Pfad/Dateiname so aus:

'/home/.../Lauflicht KITT.avr' welcher im Skript ignoriert wird wegen der 2 ' Zeichen, diese werden mit:

1
2
dumm=${Datei%r*}'r'
avr_Datei='/'${dumm#*/}			# die avr_Datei ohne ' Zeichen

Die Befehle um Zeichenketten zu bearbeiten sind:

ziel=${quelle%%X*}			# %%X* ergibt alles vor dem ersten "X"
ziel=${quelle%X*}			# %X* ergibt alles vor dem letzten "X"

Da das Zeichen ' eine besondere Bedeutung hat kann man es bei der Zeichenkettenbearbeitung nicht einsetzen, darum schneide ich alles ab dem "r" ab und hänge es dann wieder dran.

Grüßle, Naubaddi

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4784

Wohnort: Berlin

@Naubaddi: Wenn $1 keinen Inhalt hat, dann hast Du beim Aufruf schon was falsch gemacht. Denn das funktioniert selbstverständlich unter Ubuntu.

Keine Ahnung warum Du denkst das da beim read einfache Anführungstriche entstehen, denn das tun sie nicht:

#!/bin/bash
echo "Welche Datei soll kompiliert werden?"
read -r avr_Datei
echo ">$avr_Datei<"

Testlauf:

$ ./test.sh
Welche Datei soll kompiliert werden?
/home/.../Lauflicht KITT.avr
>/home/.../Lauflicht KITT.avr<

Wie man sieht: keine ' im Namen. Das wäre auch komisch. Wenn Du da nicht explizit Anführungszeichen eingibst, erfindet read da auch keine hinzu.

Kann es sein, dass es überhaupt nichts mit Ubuntu vs. Xubuntu zu tun hat, und Du nur zufällig mit dem Systemwechsel noch irgend etwas anderes geändert hast? Zum Beispiel das erste mal ein Dateiname mit einem Leerzeichen?

Naubaddi

(Themenstarter)
Avatar von Naubaddi

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 806

Hi,

bei mir sieht es so aus:

1
2
3
4
Welche Datei soll kompiliert werden?
'/home/user/Dokumente/programmieren/BASCOM/2 speichern.sh' 
>'/home/user/Dokumente/programmieren/BASCOM/2 speichern.sh'<
user@LT:~$

die 2 ' sind nicht von mir, die macht das System.

wie schon erwähnt, wenn es funktionieren würde ich den Blödsinn nicht machen.

Grüßle, Hermann

Antworten |