在Bash脚本中给$@添加引号的作用是什么?
Bash中"$@"与$@的区别及作用
核心差异
- 不带引号的
$@:Shell会将所有传入脚本的参数按空白符(空格、制表符、换行)拆分,同时还会执行文件名扩展(比如*会被展开成当前目录下的所有文件)。这会导致包含空格的参数被拆成多个独立项,彻底破坏原参数的完整性。 - 带引号的
"$@":会完整保留每个原始参数的独立性。每个参数(即使包含空格、通配符)都会被原样传递,不会被拆分或扩展,相当于把每个参数作为一个单独的“整体”处理。
实际示例
写一个简单的测试脚本test_args.sh:
#!/bin/bash echo "=== 不带引号的\$@ ===" for item in $@; do echo "项:$item" done echo -e "\n=== 带引号的\"\$@\" ===" for item in "$@"; do echo "项:$item" done
执行命令./test_args.sh "hello world" foo*,假设当前目录下有foo1.txt和foo2.txt两个文件,输出结果如下:
=== 不带引号的$@ ===
项:hello
项:world
项:foo1.txt
项:foo2.txt=== 带引号的"$@" ===
项:hello world
项:foo*
你遇到问题的原因
当你传递包含空格的命令或参数时,不带引号的$@会把带空格的参数拆分成多个部分,导致脚本接收到的参数和你预期的完全不符,进而引发命令执行错误。而"$@"会保留每个参数的原始格式,确保脚本接收到的参数和你传入的一致,自然就解决了问题。
内容的提问来源于stack exchange,提问作者Dr. Chocolate
相关产品推荐
相关产品推荐

