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
相关产品推荐
相关产品推荐

