Ich möchte eine Schleife verwenden, um einige Dateien zu finden und sie umzubenennen:
%Vor%Das funktioniert in der Shell. Aber wie kann ich das in einem Makefile-Rezept machen?
Es gibt zwei wichtige Dinge, die Sie wissen müssen, wenn Sie nicht-triviale Shell-Fragmente in make-Rezepte einfügen:
Kommandos im Rezept werden (natürlich!) einzeln ausgeführt, wobei command "tab-prefixed line im Rezept" bedeutet, möglicherweise über mehrere Makefiles mit Backslashes verteilt.
Ihr Shell-Fragment muss also auf eine (möglicherweise rückgestrichene) Zeile geschrieben werden. Darüber hinaus wird es der Shell effektiv als einzelne Zeile präsentiert (die Backslashed-Zeilenumbrüche sind keine einfachen Zeilenumbrüche und werden daher nicht als Befehlsterminatoren von der Shell verwendet), müssen also als solche syntaktisch korrekt sein.
Sowohl Shell-Variablen als auch make-Variablen werden durch Dollarzeichen ( $@
, $i
) eingeführt. Daher müssen Sie Ihre Shell-Variablen vor make verbergen, indem Sie sie als $$i
schreiben. (Genauer gesagt, jedes Dollarzeichen, das Sie von der Shell sehen möchten, muss von make entkernt werden, indem Sie es als $$
schreiben.)
Normalerweise würden Sie in einem Shell-Skript separate Befehle in separaten Zeilen schreiben, aber hier erhalten Sie effektiv nur eine einzige Zeile, daher müssen die einzelnen Shell-Befehle mit Semikolons getrennt werden. Wenn Sie all dies für Ihr Beispiel zusammenstellen, ergibt sich:
%Vor%oder äquivalent:
%Vor%Beachten Sie, dass Letzteres, obwohl es in mehreren Zeilen lesbar ist, die gleiche vorsichtige Verwendung von Semikola erfordert, um die Shell glücklich zu halten.