awk
各関数引数に対してdoループを使用して実行したいbashスクリプトに実装があります。各引数は複数行の文字列で構成されます。
for arg in "$@"; do
done
<<< "$@"
これはすべての関数パラメータを渡すためのawk実装です。
私が望むのは、arg
すべてのパラメータを同じに渡すのではなく、各パラメータを個別に使用することです"$@"
。
awk '
BEGIN {
kl=0
kmd="tput sgr0"
rst = ( (kmd | getline outp) > 0 ? outp : "<" "sgr0" ">" )
close(kmd)
ka = "Wht 15 Grn 34 Blu 39 Ylw 11 Red 196 Amb 214"
kb = "Cyn 51 Mgn 201 Syp 39 Code 39"
ks = sprintf("%s %s", ka, kb)
n = split(ks, kaggr) # split makes kaggr start at index 1
for ( i=1; i<n; i+=2 ) {
knam = kaggr[i] ":"
knum = kaggr[i+1]
kmd=sprintf("%s%d\n", "tput bold; tput setaf ", knum)
tseq[knam] = ( (kmd | getline outp) > 0 ? outp : "<" knam ">" )
close(kmd)
}
}
## Detect keyword in index of array tseq, tseq[indx].
($1 in tseq) { kl=1 ; ctp=$1 ; next }
/Rst:/ { kl=0 ; next } # Reset colour rendition
kl { print tseq[ctp] $0 rst } # Print with specified colour
!kl { print } # Use terminal text colour
' <<< "$@"
以前の作業では、パイプラインにループがあると変数が消える問題がありました。詳細については、[https://mywiki.wooledge.org/BashFAQ/024][1]をご覧ください。
変数が消える問題は、awkの配管にとって実際には重要ではないと思います。
答え1
ループがループ変数として使用されているようです。その変数を使用して、その変数の内容をコードにリダイレクトarg
できる必要があります。<<<"$arg"
awk
for arg do
awk '...as in the question...' <<<"$arg"
done
または、より多くの入力をしたいと思い、周囲に二重引用符を追加することを覚えている場合は$@
、
for arg in "$@"; do
awk '...as in the question...' <<<"$arg"
done
以下を使用して、標準入力にデータを渡すこともできますprintf
。これにより、ループはPOSIXと互換性があります(<<<
ここでは文字列リダイレクトは標準ではありません)。
for arg do
printf '%s\n' "$arg" | awk '...as in the question...'
done
これらすべてのループバリアントは、複数行であるかどうかにかかわらず、awk
listの各リスト要素に対してコードを一度実行します。"$@"
awk
問題はコード入力管理にあるので、実際にあなたのコードを見ていません。