Dies ist für unsere wöchentliche Übung, keine Benotung oder Bewertung (wir bekommen nicht einmal die Antworten!)
Ich wäre wirklich dankbar, wenn jemand Zeit hätte, mir diese Übung zu erklären, da ich versuche, diese Arbeit übers Wochenende zu erledigen und erst nächste Woche Hilfe von meinem Tutor bekommen kann. Ich habe viel gelesen und gearbeitet, was Bash-Programmierung, Regex und Grep betrifft. Aber der folgende Code hat mich einfach nur verwirrt.
Ich frage mich sogar, ob die Anleitung unvollständig ist oder ob ich es einfach nicht verstehe?
Im Einzelnen sind es folgende, die mich daran hindern, das Ganze zu verstehen:
NAMES=`ls *.$1`
filed=$(file:$1).$2
Übung 4.3
Angenommen, Sie erhalten eine Textdatei (mit dem Namen myfile) mit dem folgenden Inhalt
#!/bin/bash
NAMES=`ls *.$1`
for file in $NAMES; do
filed=$(file%:$1).$2
mv file filed
done
Führen Sie die folgenden Befehle aus: $ grep ' file ' myfile
$ grep 'file*' myfile
$ grep '^ *file*' myfile
$ grep 'file$' myfile
$ sed 's/ file* / script /g' myfile
$ sed ' /for/,/files/d' myfile
$ sed '/\$[A-Z]..[A-Z]*/d' myfile
Erklären Sie dann die Ausgabe bzw. die Ergebnisse
Antwort1
NAMES=`ls *.$1`
Dies ist eine Zuweisung. Der Variablen $NAMES
wird ein Wert zugewiesen. Der Wert wird als Ausgabe des Befehls in Backquotes übernommen (siehe Befehlsersetzung in man bash
). $1
ist ein spezieller Parameter, er entspricht dem ersten Argument des Skripts. Daher scheint das Skript mit einer Erweiterung als Parameter ausgeführt werden zu müssen (z. B. ./script.sh txt
), die Ausgabe des ls
Befehls wird in der Variablen gespeichert.
filed=$(file%:$1).$2
Das ist wirklich seltsam. Sind Sie sicher, dass die Klammern nicht tatsächlich geschweifte Klammern waren? Außerdem sollte ein .
statt dem stehen :
.
filed=${file%.$1}.$2
${var%pattern}
schneidet das Muster vom Ende der Variablen ab. Weitere Einzelheiten finden Sie unter Parametererweiterung man bash
. In diesem Fall werden also der Punkt und die durch den ersten Parameter angegebene Erweiterung entfernt und ein Punkt und der zweite Parameter hinzugefügt.
Übrigens sollte die Bewegungslinie wahrscheinlich sein
mv $file $filed
andernfalls gäbe es keinen Grund, eine Schleife zu verwenden.