【问题标题】:Access command line argument inside bash function?在bash函数中访问命令行参数?
【发布时间】:2015-01-17 14:53:48
【问题描述】:

我正在尝试访问下面函数中的命令行参数,但我无法让它工作。我相信这与引号有关,但我无法弄清楚。

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

【问题讨论】:

  • 您能否提供一个示例输入/输出示例?

标签: bash function shell command-line-arguments


【解决方案1】:

这会起作用(但你必须小心你使用的参数):

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

这里的危险是$1 成为代码的一部分,如果它包含 awk 活动字符,可能会做一些令人惊讶的事情。

这样比较安全:

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 一起应用。第一个要求这是第二行。第二个要求此行匹配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

【讨论】:

  • 我建议您使用printf '%q\n' 而不是echo 进行演示——这样字符串拆分的效果也很明显,可以将printf '%q\n' $var $(date) $((2*3))printf '%q\n' "$var" "$(date)" $((2*3)) 区分开来。跨度>
猜你喜欢
  • 2012-09-01
  • 2014-01-30
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
相关资源
最近更新 更多