在bash函数中访问命令行参数?

时间:2014-11-19 21:59:41

标签: bash function shell command-line-arguments

我试图在下面的函数中访问命令行参数但我无法使其工作。我认为这与报价有关,但我无法弄清楚。

search_second_line() {
    awk 'FNR==2 {if (/$1)/) print FILENAME; nextfile}' ./*
}
alias st="search_second_line"

1 个答案:

答案 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

shell和引用

单引号和双引号之间的差异可以在命令行中轻松演示。尝试:

$ 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