Bash脚本countscript.sh中向sed命令传递参数失败的问题求助
解决Bash脚本参数传递与sed命令的问题
一、先搞定参数传递的报错问题
兄弟,你的问题出在脚本里sed $1 q这行的写法上!当你传入参数3时,Shell会把这行拆成sed 3 q来执行——sed会把第一个参数3当成要运行的命令,但3根本不是sed的合法命令,这不就报“missing command”错了嘛。
给你两种简单的修复方法:
方法1:把参数和q拼接成一个整体
把脚本第3行改成这样:
tr -cs A-Za-z '\n' | tr A-Z a-z | sort | uniq -c | sort -rn | sed "${1}q"
用${1}q把你的参数和q拼成一个完整的sed命令参数,比如传入3的话,sed收到的就是3q,和你直接执行的那条正确命令完全一致。
方法2:换用更直观的sed打印语法
如果你觉得拼接有点别扭,也可以写成打印前N行的形式,效果是一样的:
tr -cs A-Za-z '\n' | tr A-Z a-z | sort | uniq -c | sort -rn | sed -n "1,${1}p"
-n让sed默认不输出,1,${1}p就是打印从第1行到第N行的内容,同样能达到你要的取前N个结果的目的。
修复后再测试你的命令:
echo " one two two three three three" | ./countscript.sh 3
就能得到正确输出啦:
3 three 2 two 1 one
二、关于Knuth那个脚本的bug
你说的这个脚本确实存在这个参数传递的bug!这是个典型的Shell脚本陷阱——很多人(包括一些经典教材的例子)容易忽略Shell的单词拆分规则,把本该是一个整体的sed命令拆成了两个参数,导致sed无法识别。这个bug的核心就是没把$1和q组合成一个完整的sed命令参数,反而让Shell把它们拆成了独立的两个部分传给sed,自然就跑崩了。
内容的提问来源于stack exchange,提问作者re-issue
相关产品推荐
相关产品推荐

