我awk
在 bash 脚本中有一个实现,我想使用 do 循环为每个函数 arg 运行。每个 arg 由多行字符串组成。
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
为列表中的每个列表元素运行一次代码"$@"
,无论它们是否是多行的。
请注意,我并没有真正查看您的awk
代码,因为问题在于代码输入的管理。