Другой ответ, который помог мне разгадать тайну, заключается в том, чтобы настроить метод вызова awk и обойти вопрос сценариев оболочки, заключающийся в том, чтобы обработать awk таким способом.
Думаю, я решил проблему с синтаксисом сценария оболочки. Настройка:
args.sh:
#!/bin/bash
# copypasta code that shoves $1, $2... into 0-indexed bash array and prints it out.
# store arguments in a special array
args=("$@")
# get number of elements
ELEMENTS=${#args[@]}
# echo each element in array
# for loop
for (( i=0;i<$ELEMENTS;i++)); do
echo ARGS[${i}]: ${args[${i}]}
done
test.sh:
date="date -r "
./args.sh '{
cmd = "'$date'" substr( $1, 1, length($1) - 3 ) " +\"%Y-%m-%d %H:%M\""
if ( (cmd | getline dd) > 0 ) {
$1 = dd
}
close(cmd)
print
}'
Исполнение:
❯ ./args.sh one two three
ARGS[0]: one
ARGS[1]: two
ARGS[2]: three
❯ bash test.sh
ARGS[0]: { cmd = "date
ARGS[1]: -r
ARGS[2]: " substr( $1, 1, length($1) - 3 ) " +\"%Y-%m-%d %H:%M\"" if ( (cmd | getline dd) > 0 ) { $1 = dd } close(cmd) print }
Объяснение: пробелы в вашей наивно расширенной переменной оболочки без двойных кавычек приводят к тому, что тест, использующий echo
, не выявляет действительную коренную проблему получения awk 3 аргументов вместо 1 аргумента, как ожидалось. Первым аргументом является неправильная неполная программа awk.
Вот мое исправление: я добавил двойные кавычки. Команда shell теперь выглядит довольно мрачно, с большим количеством цитирования.
❯ cat test.sh
date="date -r "
./args.sh '{
cmd = "'"$date"'" substr( $1, 1, length($1) - 3 ) " +\"%Y-%m-%d %H:%M\""
if ( (cmd | getline dd) > 0 ) {
$1 = dd
}
close(cmd)
print
}'
❯ bash test.sh
ARGS[0]: { cmd = "date -r " substr( $1, 1, length($1) - 3 ) " +\"%Y-%m-%d %H:%M\"" if ( (cmd | getline dd) > 0 ) { $1 = dd } close(cmd) print }
Я не буду комментировать использование awk, потому что я не знаю, как использовать awk.
Этот тип кода будет довольно хрупким, но, по крайней мере, у нас пока нет больших стеков обратной косой черты. Кто-нибудь писал в последнее время?