Hier ist mein Skript (um die Dateien zu finden, die ein bestimmtes Muster enthalten):
find . -type f \
-exec awk -v vawk="$1" '/'"$vawk"'/ {c++} c>0 { print ARGV[1]; exit 0 } END { if (! c) {exit 1}}' \{\} \;
Ich möchte mein Skript mit einem Argument verwenden §:
MyScript.sh pattern
Mein Problem ist, dass ich es nicht schaffe, die $1
Variable einzufügen awk
.
Wenn ich versuche, mein Skript zu debuggen
bash -x MyScript.sh pattern
Hier ist die Ausgabe:
+ find . -type f -exec awk -v vawk=pattern '// {c++} c>0 {print ARGV[1] ; exit 0 } END { if (! c) {exit 1}}' '{}' ';'
Die $vawk
Variable scheint leer zu sein.
Irgendeine Idee?
awk
die C-ähnlichen Escape-Sequenzen in erweitert werden$1
, sodass dieser Ansatz nicht funktioniert, wenn er$1
möglicherweise Backslash-Zeichen enthält (häufig für reguläre Ausdrücke). Sie könnenENVIRON
stattdessen das awk-Spezialarray verwenden.Wiedergabe aus dieser nun abgeschlossenen doppelten Frage, da sie Warnungen zu den Einschränkungen der Übergabe von awk-Variablen enthält, die möglicherweise nützlich sind.
Eine Shell-Variable ist genau das: eine Shell- Variable . Wenn Sie daraus eine awk- Variable machen möchten , benötigen Sie eine Syntax wie:
oder
Diese haben jedoch ein Problem: Escape-Sequenzen werden in ihnen erweitert (und mit GNU
awk
4.2 oder höher wird es als regulärer Variablentyp behandelt , wenn es mit$x
beginnt@/
und endet/
.Wenn die Shell-Variable beispielsweise die beiden Zeichen Backslash und n enthält , enthält die awk-Variable am Ende das Zeilenumbruchzeichen (und bei gawk 4.2+ enthält
@/foo/
die awk-Variable , sofern sie enthält , denfoo
Typ und ist vom Typregexp
).Ein anderer Ansatz (der jedoch
-v
ein POSIX awk oder nawk erfordert (im Gegensatz zu dem/bin/awk
in Solaris noch in den 1970er Jahren gefundenen awk )) ist die Verwendung von Umgebungsvariablen:Ein anderer Ansatz (immer noch mit neueren awks) ist die Verwendung des ARGV-Arrays in awk:
quelle