staging.inyokaproject.org

Wie formuliert man eine "wenn nicht"-Bedingung?

Status: Ungelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

Purpur

Avatar von Purpur

Anmeldungsdatum:
15. Mai 2005

Beiträge: 288

Hallo alle,

für ein wenig Skripting brauche ich eure Hilfe. Es geht dabei zuerst einmal nur um das Prinzip und die grundlegende Struktur. Wenn ich das habe, komme ich vermutlich weiter.

Das Skript soll

  • Eine Zeichenkette annehmen und in die Variable "foldername" speichern

  • Eine Zeichenkette annehmen und in die Variable "filename" speichern

  • Prüfen, ob ein Ordner mit dem Namen in Variable "foldername" existiert

  • Wenn [NEIN]: Den Ordner "foldername" erzeugen

  • Wenn [JA]: In den Ordner "foldername" springen

  • Eine Datei "filename" erzeugen

  • Das Skript beenden

Der Wenn[JA]-Zweig kann kann nur sinnvoll ausgeführt, wenn "foldername" existiert. Daher zuerst die Wenn[NEIN]-Abfrage.

Hier mal meine natürlich nicht funktionierenden Version:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/bash

# File:	how2script.sh
# Date:	04.06.2023

# Beschreibung:
# 	Das Skript soll
#		Eine Zeichenkette annehmen und in die Variable "foldername" speichern
#		Eine Zeichenkette annehmen und in die Variable "filename" speichern
#		Prüfen, ob ein Ordner mit dem Namen in Variable "foldername" existiert
#		Wenn [NEIN]:	Den Ordner "foldername" erzeugen
#		Wenn [JA]:	In den Ordner "foldername" springen
#					Eine Datei "filename" erzeugen
#		Das Skript beenden
			
# Variable:
#	foldername = Name des Ordners, dessen Existenz geprüft werden soll
#	filename = Name der Datei, die erzeugt werden soll

# Abfrage der Variablen
echo
echo Ausgefüht wird: how2script.sh
echo
read -p "Ordnername: " foldername
read -p "Dateiname: " filename

# Prüfen und weiter
if not -d foldername
	then
		mdir foldername
	else
		cd foldername
		touch filename
fi

# Skript beenden
echo
echo Ende
echo

# [eof]

Mein Hauptproblem besteht vor allem darin, dass ich nicht weiß, wie ich die Wenn[NEIN]-Abfrage formulieren soll.

Würde mich sehr freuen, wenn mir jemand von euch weiterhelfen könnte.

Beste Grüße, Alexander

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4212

if [[ ! -d "$foldername" ]]; then .... 

Und in Zeile 30 muss es mkdir und nicht mdir heissen.

Und in Zeilen 32 und 33 dann auch "$filename" bzw. "$foldername" verwenden.

Hm, und wenn der Ordner nicht existiert, soll dann wirklich nur der Ordner angelegt oder auch trotzdem dann die Datei darin erzeugt werden?

Dann ginge das einfach so

[[ ! -d "$foldername" ]] && mkdir "$foldername"; 
touch "$foldername"/"$filename"

oder auch ganz ohne die if-Abfrage:

mkdir -p "$foldername"
touch "$foldername"/"$filename"

Also bei dieser Lösung wird eben nicht in das Verzeichnis gewechselt, aber das ist auch einfach unnötig.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Doc_Symbiosis schrieb:

mkdir -p "$foldername"
touch "$foldername"/"$filename"

Das wäre auch meine bevorzugte Lösung. Du kannst die zwei inneren " allerdings sparen. Außerdem würde ich das als Parameter übergeben - das ist flexibler.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/sh

set -e

foldername="$1"
filename="$2"

[ -z "$foldername" ] || { echo "ERROR: empty folder name" >&2; exit 1; }
[ -z "$filename" ] || { echo "ERROR: empty file name" >&2; exit 2; }

mkdir -p "$foldername"
touch "$foldername/$filename"

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17432

1
2
3
4
# Abfrage der Variablen
echo
echo Ausgefüht wird: how2script.sh
echo

Das kann man flexibler machen:

1
2
3
4
# Abfrage der Variablen
echo
echo Ausgefüht wird: $0
echo

Bei Änderung des Namens oder Cut-n-paste-Programmierung funktioniert das trotzdem.

1
2
3
4
5
6
7
8
# Prüfen und weiter
if not -d foldername
	then
		mdir foldername
	else
		cd foldername
		touch filename
fi

Die Prüfung und der Verzeichniswechsel sind überflüssig, denn wenn mkdir ein Verzeichnis erzeugen soll, das es schon gibt, tut es nichts.

1
2
mkdir $foldername
touch $foldername/$filename

tut's auch.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

user_unknown schrieb:

Die Prüfung und der Verzeichniswechsel sind überflüssig, denn wenn mkdir ein Verzeichnis erzeugen soll, das es schon gibt, tut es nichts.

Nicht ganz:

1
2
3
4
5
6
7
8
$ ls -1
$ mkdir foo
$ echo $?
0
$ mkdir foo
mkdir: cannot create directory ‘foo’: File exists
$ echo $?
1

Solche Fehlermeldungen vermeidet man halt mit der Option -p. Und, wenn ein Skript mit set -e läuft, führt diese Variante zum vorzeitigen Abbruch des Skriptes, obwohl es weiter arbeiten könnte.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17432

Stimmt. Ich ziehe meinen Einwurf zurück.

Antworten |