我在bash脚本中有一个awk实现,我希望使用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 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
' <<< "$@"在以前的工作中,我遇到了当循环处于管道中时,变量会消失的问题。有关更多细节,请参见。
虽然我认为,对于流水线的情况,awk,消失变量的问题并不是真正的问题。
发布于 2023-02-20 08:41:13
您的循环使用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代码,因为问题是关于代码输入的管理。
https://unix.stackexchange.com/questions/736161
复制相似问题