我试图在下面的函数中访问命令行参数但我无法使其工作。我认为这与报价有关,但我无法弄清楚。
search_second_line() {
awk 'FNR==2 {if (/$1)/) print FILENAME; nextfile}' ./*
}
alias st="search_second_line"
答案 0 :(得分:5)
这将有效(但你必须小心你用于参数):
st() { awk "FNR==2 {if (/$1/) print FILENAME; nextfile}" ./*; }
这里的危险是$1
成为代码的一部分,如果它包含awk-active字符,可能会做出令人惊讶的事情。
这有点安全:
st() { awk -v c="$1" 'FNR==2 {if ($0 ~ c) print FILENAME; nextfile}' ./*; }
在这里,我们将awk传递给具有c
内容的变量$1
。 awk会知道将c
视为变量,而不是代码。
这与上述相同,但它简化了逻辑:
st() { awk -v c="$1" 'FNR==2 && $0~c {print FILENAME; nextfile}' ./*; }
-v c="$1"
这定义了awk变量c
。这是将信息从shell传递到awk
最可靠的。
FNR==2 && $0~c {print FILENAME; nextfile}
这会在执行print
/ nextfile
语句之前将两个条件和&#d; d在一起应用。第一个要求这是第二行。第二行要求此行匹配c
。
单引号和双引号之间的差异可以在命令行中轻松演示。尝试:
$ var="Hello"
$ echo '$var'
$var
$ echo "$var"
Hello
如上所示,shell按字面意思处理单引号的内容。它不会改变单引号内的内容。相比之下,shell将处理双引号的内容,执行变量替换(如上所示),以及命令替换和算术扩展。为了证明后两者:
$ echo '$var $(date) $((2*3))'
$var $(date) $((2*3))
$ echo "$var $(date) $((2*3))"
Hello Wed Nov 19 14:15:44 PST 2014 6