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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:10:36