Script di Bash per creare una struttura di cartelle


1

Sto provando a scrivere uno script Bash per automatizzare un'attività ricorrente, vale a dire la creazione di una struttura di cartelle, in cui alcune di esse dovrebbero essere numerate (Per essere più specifici, si intende archiviare alcune serie TV che ho convertito dal DVD in una struttura di cartelle facilmente comprensibile dal lettore multimediale Kodi)

Un primo tentativo è stato così:

echo "Insert the title of the series"
read title

mkdir $title
mkdir $title/extrafanart
mkdir $title/themes
mkdir $title/videoextras

for num in {1..3}
do
  mkdir $title/"Season $num"
done

Questo crea correttamente la seguente struttura, ad esempio

Star Trek
Star Trek\extrafanart
Star Trek\Season 1
Star Trek\Season 2
Star Trek\Season 3
Star Trek\themes
Star Trek\videoextras

che è esattamente quello di cui avevo bisogno. Ma, come probabilmente vedrai, c'è uno svantaggio principale in questo script: il numero totale di cartelle stagionali è fisso e non scelto dinamicamente ogni volta che lo script viene eseguito. Quindi ho provato a modificarlo come segue

echo "Insert the title of the series"
read title
echo "Insert the number of seasons"
read seasons

mkdir $title
mkdir $title/extrafanart
mkdir $title/themes
mkdir $title/videoextras

for num in {1..$seasons}
do
  mkdir $title/"Season $num"
done

Questa volta, il risultato non è esattamente quello che mi aspettavo, questo è quello che ottengo

Star Trek
Star Trek\extrafanart
Star Trek\Season {1..3}
Star Trek\themes
Star Trek\videoextras

che NON è quello di cui ho bisogno.

Immagino che il problema sia nella prima riga del forciclo, in cui l'espansione del controvento viene letta dalla shell come una stringa e non come un'espressione da valutare. Ho ragione?

Cosa c'è di sbagliato e come posso correggere questo script?


1
L'espansione dei parametri avviene dopo l'espansione del controvento, quindi {1..$seasons}non è un'espansione del controvento valida e viene trattata letteralmente.
Chepner,

In realtà, la sceneggiatura fornita non dovrebbe funzionare correttamente a causa di spazi, ecc. Nei titoli degli spettacoli. Dovresti davvero avere doppie virgolette attorno a riferimenti variabili tra cui $title(es. mkdir "$title"E mkdir "$title/Season $num")
Gordon Davisson,

Risposte:


2

Usa un ciclo:

num=1
while [ $num -le $seasons ]; do
  mkdir $title/"Season $num"
  num=$[ $num + 1 ]
done

Spiegazione

Stiamo utilizzando l'operatore di test e l'operatore di valutazione $ [si assomigliano, ma sono completamente diversi). [ $num -le $seasons ]verifica se $ num è L ess o E qual di $ stagioni; $[ $num + 1 ]aggiunge uno al valore numerico di $ num e lo assegna a $ num.

Per informazioni sull'operatore di test, digitare help testla shell bash. L'operatore di valutazione è spiegato nel manuale di bash ( man bash, attenzione, è lungo). Puoi anche usarlo per sottrarre, moltiplicare, dividere, ecc.


Grazie, ha funzionato ora. Saresti così gentile a spiegarmelo (o a indicarmi qualche risorsa online), così posso capire meglio cosa ho fatto? In particolare, quali sono i -leparametri?
Sekhemty,

Aggiunta una spiegazione
JvO,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.