Shell脚本中$0为何需加引号?dirname参数写法疑问
为什么要给
$0添加引号? 核心原因是为了处理脚本路径中包含空格、特殊字符或通配符的场景,避免Shell错误地拆分参数:
$0代表当前脚本的完整路径,如果路径里有空格(比如/home/user/my scripts/husky.sh)、特殊字符(如!)或通配符(如*),不加引号的话,Shell会执行单词拆分和路径扩展:- 单词拆分:把路径按空格分割成多个独立的参数传给
dirname - 路径扩展:把通配符(如
*)替换成当前目录下匹配的文件名
- 单词拆分:把路径按空格分割成多个独立的参数传给
举个实际例子:
假设脚本路径是/tmp/my script.sh:
- 用
dirname -- "$0":$0被完整传递为/tmp/my script.sh,dirname正确返回/tmp,最终拼接路径为/tmp/_/husky.sh,能正常加载脚本。 - 用
dirname -- $0:Shell会把$0拆成/tmp/my和script.sh两个参数传给dirname,dirname会分别处理这两个路径,输出/tmp和.(当前目录),$()捕获的输出会变成/tmp .,最终拼接出的路径/tmp ./_/husky.sh是无效的,导致找不到目标脚本。
另外,--的作用是告诉dirname后面的内容都是路径参数,避免路径以-开头时被误当作命令选项,但你的问题核心是引号的作用,重点还是防止参数拆分和扩展。
总结:给$0套上双引号,能确保脚本路径始终作为一个完整的参数传递,无论路径包含什么特殊字符,都能让dirname正确解析出脚本所在目录,保证后续_/husky.sh的加载路径正确。
内容的提问来源于stack exchange,提问作者chrikrah
相关产品推荐
相关产品推荐

