Ini skrip saya (untuk menemukan file yang berisi pola tertentu):
find . -type f \
-exec awk -v vawk="$1" '/'"$vawk"'/ {c++} c>0 { print ARGV[1]; exit 0 } END { if (! c) {exit 1}}' \{\} \;
Saya ingin menggunakan skrip saya dengan argumen §:
MyScript.sh pattern
Masalah saya adalah bahwa saya tidak berhasil memasukkan $1
variabel awk
.
Ketika saya mencoba men-debug skrip saya
bash -x MyScript.sh pattern
Berikut hasilnya:
+ find . -type f -exec awk -v vawk=pattern '// {c++} c>0 {print ARGV[1] ; exit 0 } END { if (! c) {exit 1}}' '{}' ';'
The $vawk
variabel tampaknya kosong.
Ada ide?
awk
memperluas urutan pelarian seperti-C di$1
, sehingga pendekatan tidak bekerja jika$1
mungkin berisi karakter garis miring terbalik (umum untuk regexps). Anda dapat menggunakanENVIRON
array khusus awk sebagai gantinya.Direproduksi dari ini sekarang ditutup sebagai pertanyaan rangkap karena mencakup peringatan tentang pembatasan variabel awk yang mungkin berguna.
Sebuah variabel shell hanya itu: sebuah shell variabel . Jika Anda ingin mengubahnya menjadi variabel awk , Anda memerlukan sintaksis seperti:
atau
Namun, mereka yang mengalami masalah: urutan pelarian diperluas di dalamnya (dan dengan GNU
awk
4.2 atau lebih tinggi, jika$x
dimulai dengan@/
dan berakhir/
, diperlakukan sebagai jenis variabel regexp ).Jadi, misalnya jika variabel shell berisi dua karakter garis miring terbalik dan n , variabel awk akan berakhir mengandung karakter baris baru (dan dengan gawk 4.2+, jika mengandung
@/foo/
, variabel awk akan berisifoo
dan bertiperegexp
).Pendekatan lain (tetapi yang
-v
membutuhkan untuk POSIX awk atau nawk (sebagai lawan dari tahun 1970-an masih ditemukan seperti/bin/awk
pada Solaris)) adalah menggunakan variabel lingkungan:Pendekatan lain (masih dengan awk yang lebih baru) adalah dengan menggunakan array ARGV di awk:
sumber