Bash脚本解析带引号的参数

tol*_*ira 8 shell-script quoting

请考虑这个名为test 的简单脚本:

#!/bin/bash
echo $1
Run Code Online (Sandbox Code Playgroud)

以及以下命令和调用:

$ echo "A B"
A B
$ echo ""A B""
A B
$ echo """A B"""
A B
$ echo """A B"""
A B

$ ./test "A B"
A B
$ ./test ""A B""
A
$ ./test """A B"""
A B
$ ./test """"A B""""
A
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么测试调用的行为不像命令echo或指向相关文档吗?

gle*_*man 13

因为echo连接所有它的参数来打印它们,并且您的脚本仅限于第一个参数。你应该在你的脚本中使用"$@"and $1

让我们看看您为测试提供的参数:

  • ./test "A B"
    • 一个参数,3 个字符串 AspaceB
  • ./test ""A B""
    • 两个论点
      • 首先,empty stringA
      • 第二,Bempty string
  • ./test """A B"""
    • 一个参数,empty string连接与AspaceB连接empty string
  • ./test """"A B""""
    • 两个论点
      • 首先,empty string连接与empty string连接A
      • 二、B连接与empty string连接empty string

注意:echo如果您在参数中使用多个空格,您会看到不同的结果。那是因为 echo 将其参数与一个空格连接起来:

$ echo "A   B"
A   B
$ echo ""A   B""
A B
$ echo """A   B"""
A   B
$ echo """"A   B""""
A B
Run Code Online (Sandbox Code Playgroud)

  • 确切地说,报价不嵌套...... (2认同)