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

Shell脚本中获取当前脚本名是否需用双引号?写法正确性疑问

C Shell脚本获取脚本名的双引号问题

核心结论

你写的set scriptname="basename $0"里的双引号必须加,写法整体是正确的,但还有一处可以优化的细节。

为什么必须加双引号?

C Shell的变量赋值如果不加双引号包裹命令替换结果,当basename $0的输出包含空格、特殊字符(比如()、*)时,Shell会把输出按空格拆分成多个单词,set scriptname会将这些单词赋值为数组变量。后续你用$scriptname生成lockfile或overridefile时,只会取数组的第一个元素,导致文件名完全错误。

加双引号后,basename的输出会被当作完整的单个字符串赋值给scriptname,无论脚本名或路径里有没有特殊字符,都能正确保留完整的脚本名称。

优化细节:给$0也加双引号

你的写法里basename $0存在潜在问题:如果脚本的完整路径(即$0的值)包含空格,$0会被Shell拆分成多个参数传给basename,导致basename输出错误的结果。所以更健壮的写法应该是给$0也加上双引号:

set scriptname="`basename "$0"`"

替代写法(兼容性注意)

部分新版C Shell支持用$(...)代替反引号做命令替换,写法更清晰:

set scriptname="$(basename "$0")"

但反引号`的写法兼容性更好,适合所有版本的C Shell,老环境里推荐用反引号写法。

错误示例对比

假设脚本的完整路径是/opt/my app/run.sh:

  • 不加双引号的情况:set scriptname=basename $0`` 会被解析为basename /opt/my app/run.sh,basename会把/opt/my和app/run.sh当作两个参数,输出my和run.sh,最终scriptname是数组(my run.sh),$scriptname.pid会变成my.pid,完全不符合预期。
  • 加双引号的情况:set scriptname="basename "$0"" 会正确调用basename "/opt/my app/run.sh",输出run.sh,scriptname的值就是run.sh,后续生成的/var/run/run.sh.pid完全正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:31:02