访问bash函数中的命令行参数? [英] Access command line argument inside bash function?
本文介绍了访问bash函数中的命令行参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试访问下面函数中的命令行参数,但无法使其工作。我相信这与引语有关,但我想不通。
search_second_line() {
awk 'FNR==2 {if (/$1)/) print FILENAME; nextfile}' ./*
}
alias st="search_second_line"
推荐答案
这将起作用(但您必须注意用于参数的内容):
st() { awk "FNR==2 {if (/$1/) print FILENAME; nextfile}" ./*; }
这里的危险是$1
成为代码的一部分,如果它包含awk活动字符,可能会做出令人惊讶的事情。
这样更安全:
st() { awk -v c="$1" 'FNR==2 {if ($0 ~ c) print FILENAME; nextfile}' ./*; }
这里,我们将一个变量c
传递给awk,该变量的内容为$1
。AWK将知道将c
视为变量,而不是代码。
这与上面的相同,但它简化了逻辑:
st() { awk -v c="$1" 'FNR==2 && $0~c {print FILENAME; nextfile}' ./*; }
工作原理
-v c="$1"
它定义awk变量
c
。这是将信息从外壳程序传递到awk
的最可靠方式。FNR==2 && $0~c {print FILENAME; nextfile}
这将在执行
print
/nextfile
语句之前应用两个条件并在一起。第一行要求这是第二行。第二行要求该行匹配c
。
外壳和引用
单引号和双引号之间的区别很容易在命令行中演示。尝试:
$ var="Hello"
$ echo '$var'
$var
$ echo "$var"
Hello
如上所示,外壳按字面意思处理单引号的内容。它不会更改单引号中的内容。相比之下,外壳将处理双引号的内容,执行变量替换(如上所示),以及命令替换和算术扩展。演示后两者:
$ echo '$var $(date) $((2*3))'
$var $(date) $((2*3))
$ echo "$var $(date) $((2*3))"
Hello Wed Nov 19 14:15:44 PST 2014 6
这篇关于访问bash函数中的命令行参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文