Нет, но вы можете просто интерполировать шаблон в строку, заключенную в двойные кавычки, которую вы передаете в awk:
awk -v l="$line" "BEGIN {p=0}; /$pattern/ {p=1}; END{ if(p) print l >> \"outfile.txt\" }"
Обратите внимание, что теперь вам нужно избежать двойного -в кавычках awk буквально, но это все еще самый простой способ добиться этого.
Это ошибки, которые вы получаете при попытке выполнить замену процесса в bash
, когда оболочка работает в режиме POSIX. Оболочка bash
не поддерживает замену процессов в режиме POSIX.
bash
будет работать в режиме POSIX, когда либо
set -o posix
был использован или sh
. Я подозреваю, что у вас есть скрипт, test.sh
, который вы используете с sh test.sh
или который имеет строку #!/bin/sh
hashbang, и что ваш sh
оказался bash
. Другая возможность заключается в том, что скрипт вообще не содержит строки#!
-и вызываетсяbash
-как-sh
каким-то другим способом.
Вместо этого убедитесь, что ваш test.sh
скрипт вызывается bash
.
Пример:
$ cat script.sh
echo hello
$ cat test.sh
var=$(bash <( cat script.sh ))
printf 'var="%s"\n' "$var"
$ bash -o posix test.sh
test.sh: command substitution: line 2: syntax error near unexpected token `('
test.sh: command substitution: line 2: `bash <( cat script.sh ))'
var=""
$ bash test.sh
var="hello"
Если вы хотите сделать это переносимым способом в своем test.sh
скрипте с использованием POSIXsh
:
var=$( cat script.sh | bash )
printf 'var="%s"\n' "$var"
Это приведет к тому, что процесс bash
будет считывать выходные данные cat
на своем стандартном вводе, что не совсем совпадает с вариантом подстановки процесса (, который оставляет стандартный ввод. один ). Это имеет значение, если сценарий, выполняемый внутренней оболочкой bash
, выполняет какую-либо форму чтения данных со своего стандартного ввода.
Если вам нужно оставить стандартный ввод оболочки bash
в покое (, потому что вам нужно читать из него ), вы можете предположить, что mktemp
доступен, и использовать
var=$( tmpfile=$(mktemp); cat script.sh >"$tmpfile" && bash "$tmpfile"; rm -f "$tmpfile" )
printf 'var="%s"\n' "$var"
Где cat script.sh
понимается как более поздняя замена на вашу команду curl
.
Если вам удобно жонглировать файловыми дескрипторами,вы также можете сделать файловый дескриптор 3 копией стандартного входного дескриптора перед вызовом оболочки bash
, а затем позволить выбранному сценарию читать из этого:
var=$( exec 3<&0; cat script.sh | bash )
printf 'var="%s"\n' "$var"
Затем сценарий script.sh
будет использовать read -u 3
для чтения из исходного стандартного входного потока или utility <&3
для перенаправления этого входного потока в другую утилиту.