Não faça do awkline
um script separado: isso significa que você terá que exportar todas as variáveis que deseja passar para o awk. Você pode torná-lo uma função que você adiciona ao seu .bashrc. Dessa forma, ele é executado no processo shell atual e tem acesso às suas variáveis do shell.
O manuseio dos parâmetros será complicado: você pode:
-
passa as variáveis como uma string delimitada por espaço e deixa existir um número variável de argumentos de arquivo:
awkline "var1 var2 var3" "awk body" file ...
-
ou ter a função sempre lida de stdin e permitir um número variável de nomes de variáveis:
cat file1 file2 ... | awkline var1 var2 ... "awk body"
Para codificar o primeiro:
awkline () {
local variables=$1
local body=$2
shift 2
local files=("$@")
set -- $variables # no quotes here, now the positional params are the var names
local awk_cmd=(awk)
for var; do
awk_cmd+=(-v "$var=${!var}")
done
"${awk_cmd[@]}" "$body" "${files[@]}"
}
Dado o uso em seu comentário, isso pode ser simplificado:
awkline () {
local awk_vars=()
for var in $1; do # no quotes here
awk_vars+=(-v "$var=${!var}")
done
shift
awk "${awk_vars[@]}" "$@"
}