bash函数参数索引 - 头部和回声之间的差异

时间:2014-06-06 19:12:38

标签: bash

我对" head"中的奇怪行为感到困惑。访问函数参数时的命令。 这是代码:

function fun1 { echo $1; head $1; }

以下是2个不同函数调用的输出

echo "asasa" | fun1
--- output start ---

asasa
--- end ---

并且在传递参数时:

echo "asasa" | fun1 "var1"
--- output start ---
var1
head: cannot open `var1' for reading: No such file or directory
--- end ---

访问参数1($ 1)到底发生了什么?为什么head和echo对它的解释却截然不同?

2 个答案:

答案 0 :(得分:4)

$1总是指在命令行上传递的第一个参数,它与通过 stdin 的任何输入分开。

head期望作为其(非选项)参数的一个或多个文件名 - 如果没有,则从 stdin 读取输入。 (处理文件内容的许多实用程序都以这种方式运行)。

echo "asasa" | fun1 ...仅限stdin输入,没有参数($1未设置):

  • echo $1回显空行(仅\n),因为$1未设置。
  • head $1回声(最多10行) stdin asasa):因为$1未设置,就好像没有参数传递给head,因此它从 stdin 读取。

echo "asasa" | fun1 "var1" ... stdin输入和1个参数:$1设置为var1

  • echo $1回显var1,分配给$1的值。
  • head $1报告错误,因为var1被解释为文件名,并且不存在此类文件;在这种情况下, stdin输入 忽略

如果您希望echo访问参数head访问 stdin输入,只需删除$1参数即可head命令:

function fun1 { echo $1; head; }

相反,如果您真的想要处理通过参数$1传递的字符串head,则必须通过 stdin 中明确提供它脚本(例如,通过<<<):

function fun1 { echo $1; head <<<"$1"; }

答案 1 :(得分:1)

head只有在它的参数为空时才从stdin读取输入。由于你向它传递了一个参数,它试图改为读它。

Usage: head [OPTION]... [FILE]...
Print the first 10 lines of each FILE to standard output.
With more than one FILE, precede each with a header giving the file name.
With no FILE, or when FILE is -, read standard input.