Ksh脚本命令行参数传递时如何转义反引号(`)?
解决ksh脚本中反引号内变量无法替换的问题
这个问题其实是shell命令替换里的变量展开规则导致的——你原来的写法里,单引号把$1当成了纯文本字符串,而不是脚本的命令行参数;另外反引号的语法有时候在变量解析上容易让人混淆,给你两个简单的解决办法:
方法1:用双引号包裹变量,保留反引号写法
把grep的参数改成双引号包裹的"$1",这样shell会先替换$1为你传入的命令行参数,再执行管道里的命令:
#!/usr/bin/ksh othercommand `firstcommand | grep "$1" | cut -d ' ' -f 1`
一定要用双引号,不然如果你的关键词里有空格或者特殊字符(比如*),shell会把它拆分成多个参数传给grep,导致匹配出错。
方法2:改用$()代替反引号(推荐)
ksh完全支持$()这种命令替换语法,它比反引号可读性更好,嵌套逻辑更清晰,变量展开也不容易出问题:
#!/usr/bin/ksh othercommand $(firstcommand | grep "$1" | cut -d ' ' -f 1)
这个写法和反引号的功能完全一样,但更直观,后续维护脚本的时候也不容易踩坑。
额外调试小技巧
如果不确定变量有没有正确替换,可以在脚本开头加上set -x,这样shell会把每一步执行的命令和变量替换结果打印出来,方便你排查问题:
#!/usr/bin/ksh set -x othercommand $(firstcommand | grep "$1" | cut -d ' ' -f 1)
内容的提问来源于stack exchange,提问作者00__00__00
相关产品推荐
相关产品推荐

