为awk编写shell包装器脚本
我想在shell脚本中嵌入一个awk脚本,但我很难做到这一点,因为我不知道在哪里用一个;哪里没有 这是我的剧本为awk编写shell包装器脚本,shell,awk,Shell,Awk,我想在shell脚本中嵌入一个awk脚本,但我很难做到这一点,因为我不知道在哪里用一个;哪里没有 这是我的剧本 #!/bin/sh awk=' BEGIN {FS = ",?+" } # removes all backspaces preceded by any char except _ function format() { gsub("[^_]\b", "") } function getOptions() { getline format()
#!/bin/sh
awk='
BEGIN {FS = ",?+" }
# removes all backspaces preceded by any char except _
function format() {
gsub("[^_]\b", "")
}
function getOptions() {
getline
format()
print
}
{
format()
if ($0 ~ /^SYNOPSIS$/ {
getOptions()
next
}
if ($0 /^[ \t]+--?[A-Za-z0-9]+/) {
print $0
}
}
END { print "\n" }'
path='/usr/share/man/man1'
list=$(ls $path)
for item in $list
do
echo "Command: $item"
zcat $path$item | nroff -man | awk "$awk"
done > opts
顺便说一下,我在用纳克
提前感谢我不太清楚您的意思,但如果我理解正确,您的showOpts.awk就是脚本开头的awk代码,因此您可以这样做
path='/usr/share/man/man1'
list=$(ls $path)
for item in $list
do
echo "Command: $item"
zcat $path$item | nroff -man | nawk ' BEGIN {FS = ",?+" }
# removes all backspaces preceded by any char except _
function format() {
gsub("[^_]\b", "")
}
function getOptions() {
getline
format()
print
}
{
format()
if ($0 ~ /^SYNOPSIS$/ {
getOptions()
next
}
if ($0 /^[ \t]+--?[A-Za-z0-9]+/) {
print $0
}
}
END { print "\n" } '
done >> opts
您可能应该使用>>而不是>据我所知,有几件事是错误的:
$awk
的多行字符串。在END{…}
$awk
。也许您的意思是在do
循环中调用awkawk
通常对分号相当宽容,但这方面的任何问题都与在shell脚本中使用分号无关path='/usr/share/man/man1'
list=$(ls $path)
for item in $list
需要更改为:
path='/usr/share/man/man1'
for item in $path/*
如果文件名中有空格,因为
ls
不打算以这种方式使用。我建议将文字awk程序嵌入循环中,这样会使整个shell脚本非常难以读取。首先将其分配给一个变量(就像OP试图做的那样),然后调用awk“$awk”
更具可读性。因为重定向在循环之外,所以没有理由必须是一个附加。在这个良好的更改之后,$path$item
应该只是$item
。此外,还应引用变量展开式。所以,zcat“$item”| nroff-man | awk“$awk”
很抱歉在这里造成了很多混乱^^。。。首先,我发布了错误的脚本版本,现在已经更正了。。。第二,脚本现在可以工作了:-)。。。原因是我忘了在双引号中加$awk,这总是在脚本的第一行给我一个语法错误…谢谢大家的回答,他们提供了很好的洞察力^^