You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本head参数前-作用与tail -1用法问题

Shell脚本管道命令执行问题记录

涉及的问题代码

练习Shell脚本过程中遇到如下代码段,对其运行逻辑和效果存在疑问:

more $1 | head -$2 | tail -1

测试文件内容

准备测试文本文件joe.txt用于验证效果,文件内容如下:

$ more joe.txt
i am trying
something
else
to
see
if
head
works
the way
it
should
work

执行现象

执行命令./sample.sh jad.txt joe.txt时触发报错:

$ ./sample.sh jad.txt joe.txt
head: invalid option -- 'j'
Try 'head --help' for more information.

将代码中$2前方的-符号移除后,脚本可正常运行,输出结果如下:

$ ./sample.sh jad.txt joe.txt
it

待澄清的两个疑问

  • tail -1参数的具体作用是什么?已知tail默认输出目标内容的最后10行,为什么这里仅输出内容“it”?
  • head命令参数中$2前方的-符号是否有特殊作用?为什么添加该符号会触发报错,移除后脚本即可正常运行?

问题解答

  • 关于tail -1的作用:
    tail命令的-<数字>是简写参数,作用是指定只输出传入内容的最后N行,-1就代表仅取输入内容的最后1行。移除$2前的-后,实际执行的管道命令为more jad.txt | head joe.txt | tail -1:more jad.txt因为文件不存在会向标准错误输出报错信息,这部分内容不会进入管道传递给后续命令;head joe.txt默认输出joe.txt的前10行内容,这部分内容通过管道传给tail -1后,仅保留前10行的最后1行,正好是文件的第10行文本it,和实际运行结果一致。
  • 关于head -$2的报错原因:
    head命令解析参数时,会默认将所有以-开头的传入值当做命令选项处理。保留$2前的-时,传入的第二个参数是joe.txt,替换后实际执行的是head -joe.txt,命令会将该字符串拆解为多个单字符选项:-j、-o、-e,但head本身没有定义-j这个合法选项,因此直接抛出无效选项的报错。
    原始练习题的正确使用方式是:第一个位置参数传入目标文件名,第二个位置参数传入纯数字的行号,例如执行./sample.sh joe.txt 10,此时-$2会被替换为合法参数-10,代表head取文件前10行,再经tail -1取出第10行内容,实现“输出指定文件第N行”的效果。之前执行报错本质是传参顺序错误,第二个参数传入了文件名而非预期的数字行号,不是题目本身的问题。

内容的提问来源于stack exchange,提问作者Michael Bacha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 21:21:25