$1
не является первым аргументом командной строки, а первым полем после того, как строка была разделена с помощью FS
(, и это будет пустая строка в BEGIN
, так как ни одна строка еще не была разделена ).
Аргументы командной строки находятся в массивеARGV
:
$ awk 'BEGIN { for(i = 1; i < ARGC; i++) print ARGV[i] }' 1st 2nd 3rd
1st
2nd
3rd
ARGV[0]
всегда имя интерпретатора(awk
или gawk
и т. д. ).
Чтобы позволить awk
игнорировать аргумент командной строки и не пытаться открыть его позже как файл, вы должны удалить его или установить в качестве пустой строки :, например. ARGV[1]=""
.
В качестве примечания: любой аргумент в форме var=value
также будет интерпретироваться awk
как присвоение переменной и будет оцениваться после того, как аргументы файла, предшествующие ему, будут обработаны. обработано:
$ echo yes > file
$ awk '{ gsub(/e/, var); print }' var=1 file var=2 file var=3 file
y1s
y2s
y3s
Чтобы использовать фактическое имя файла в форме key=val
с awk
, вы должны передать его как относительный или абсолютный путь, например.awk '{...}'./key=val
.
Вы можете попробовать использовать bash с инъекцией в маркер (, предполагая, что вы используете ключи rsa)
#!/bin/bash
sftp {user}@{host} <<EOF
cd {remote_dir}
mget *
EOF