访问bash函数中的命令行参数? [英] Access command line argument inside bash function?

查看:19
本文介绍了访问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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆