Bash-Skript zum Erstellen eines Verzeichnisses


7

Ich spiele mit Skripten herum. Ich kann ein Skript erstellen, das mich beim Ausführen zur Eingabe eines Namens für ein neues Verzeichnis auffordert, es erstellt, dann mehrere Dateien erstellt, Zeilen wiedergibt und dann alles löscht.

Was ich tun möchte, ist es leicht zu verändern, damit es das Verzeichnis selbst erstellt und benennt!

Scheint eine sinnlose Übung zu sein, die ich kenne, aber damit herumzuspielen ist der beste Weg, den ich lerne.

Hier ist mein aktuelles Skript:

#!/bin/bash   
echo "Give a directory name to create:"    
read NEW_DIR    
ORIG_DIR=$(pwd)    
[[ -d $NEW_DIR ]] && echo $NEW_DIR already exists, aborting && exit    
mkdir  $NEW_DIR    
cd $NEW_DIR    
pwd    
for n in 9 8 7 6 5 4 3 2 1 0    
do        
touch file$n    
done

ls file?    

for names in file?    
do       
echo This file is named $names > $names    
done

cat file?

cd $ORIG_DIR

rm -rf $NEW_DIR

echo "Goodbye"

Was meinst du damit, dass das Verzeichnis von selbst erstellt und benannt wird ? Wie wählt das Skript die Namen aus?
Yaron

Wie in, anstatt dass ich einen Verzeichnisnamen eingebe, wenn ich dazu aufgefordert werde, ist er bereits im Skript geschrieben.
SimplySimplified

2
Meinen Sie damit, dass Sie einen fest codierten Wert für einen Verzeichnisnamen im Skript festlegen (der den Lesevorgang ersetzt )?
Yaron

Ja, genau das!
Einfach vereinfacht

Vielleicht möchten Sie in die Bash-Parametererweiterung und die Klammererweiterung eintauchen , z. B. 9 8 7 6 5 4 3 2 1 0in Ihrem Code kann verkürzt werden {9..0}und Sie können auch die gesamte forSchleife durch ersetzen touch file{9..0}.
Dessert

Antworten:


5

Anstatt den readBefehl zu verwenden, um den Wert von NEW_DIRaus der Eingabe abzurufen , können Sie den fest codierten Wert für die Variable NEW_DIR folgendermaßen festlegen :

Ersetzen Sie die folgende Zeile in Ihrem Skript:

read NEW_DIR    

mit folgender Zeile:

NEW_DIR="new_dir_hard_coded_value"

Link für weitere Informationen zu Bash-Scripting-Tutorial / Bash-Variablen


1
Vielen Dank! Arbeitete, so einfach! Denke, die Suche wäre mit der fest codierten Phrase einfacher gewesen!
Einfach vereinfacht

5

Wenn Sie eine Überraschung wünschen, können Sie anstelle einer Hardcodierung des Namens beispielsweise eine Technik verwenden, um eine zufällige Zeichenfolge zu generieren

NEW_DIR=$(tr -cd '[:alnum:]' < /dev/urandom | fold -w8 | head -n1)

Dies setzt NEW_DIReine Zeichenfolge aus acht alphanumerischen Zeichen. Jedes Mal, wenn Sie das Skript ausführen, hat das neue Verzeichnis einen anderen zufälligen Namen ...

Oder um ein zufälliges Wort zu erhalten, wählen Sie ein Wörterbuch aus /usr/share/dict/und verwenden Sie shufzum Beispiel:

$ shuf -n1 /usr/share/dict/british-english
soupier
$ shuf -n1 /usr/share/dict/british-english
penguins

Damit

NEW_DIR=$(shuf -n1 /usr/share/dict/british-english)
mkdir "$NEW_DIR"
...

3

Anstatt zur Benutzereingabe aufzufordern, können Sie Werte mithilfe des Variablenzuweisungsoperators (=) in Skripte fest codieren. Somit sind die folgenden zwei Zeilen,

echo "Geben Sie einen Verzeichnisnamen zum Erstellen ein:"
Lesen Sie NEW_DIR

kann durch eine einzelne Zeile ersetzt werden.

NEW_DIR = "was auch immer_name_you_please"



Übrigens, ich weiß, dass dies für die Frage nicht relevant ist, aber in der forSchleife, die Sie in Ihrem Skript verwendet haben, können Sie Kurzcode für den Bereich schreiben. Stattdessen 9 8 7 6 5 4 3 2 1 0können Sie es als schreiben

 für n in {9..0} 

Nein, es ist alles relevant. Danke. Je mehr ich sehe, desto mehr lerne ich!
Einfach vereinfacht

3

Sie können sogar noch einen Schritt weiter gehen: Sie können "read" anweisen, einen Vorschlag für den Ordnernamen anzubieten, ihn durch Drücken der Eingabetaste zu akzeptieren oder ihn nach Belieben zu ändern:

read -p "Give a directory name to create: " -ei "default_name" NEW_DIR;

Dies würde eine Linie zeigen:

Give a directory name to create: default_name

Um mit den obigen Vorschlägen zu kombinieren, können Sie Folgendes tun:

# pre-set NEW_DIR to a value or to any random string 
# as suggested in the other answers
NEW_DIR="default_name"

# Prompt for new directory name, suggesting previously selected default answer
read -p "Give a directory name to create: " -ei "$NEW_DIR" NEW_DIR;

Beachten Sie, dass read -p "text" zur Eingabe des Textes auffordert und in derselben Zeile nach der Antwort fragt. Wenn Sie sich an Ihren Code halten und ihn nach dem 2-Zeilen-Format fragen möchten, können Sie dies tun

echo "Give a directory name to create:"  
read -ei "$NEW_DIR" NEW_DIR
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.