我想在shell脚本中嵌入一个awk脚本,但我很难这样做,因为我不知道在哪里结束语句;什么地方没有。
这是我的剧本
#!/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
顺便说一下,我正在使用nawk。
提前致谢
答案 0 :(得分:5)
据我所知,有几件事是错误的:
$awk
的多行字符串。在END { ... }
$awk
。也许你的意思是在do
循环中调用awk。awk
通常对分号相当宽容,但在这方面的任何问题都与在shell脚本中使用它没有任何关系。答案 1 :(得分:3)
这三行:
path='/usr/share/man/man1'
list=$(ls $path)
for item in $list
需要改为:
path='/usr/share/man/man1'
for item in $path/*
如果文件名中有空格,并且ls
不打算以这种方式使用。
答案 2 :(得分:1)
我不确定你的意思,但如果我理解正确,你的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
你应该使用>>而不是>