Bash脚本解析带引号的参数


8

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

#!/bin/bash
echo $1

以及以下命令和调用:

$ 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

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


2
已经有一个测试命令,很幸运,您使用的是完整路径,否则您将很难调试情况。
Rui F Ribeiro 2015年

3
对于这种测试,更好的方法是使用printf '%q\n' "$@"而不是根本不使用echo它,它会逐行发出带有隐藏字符和空白以可见形式转义的空白的参数。
查尔斯·达菲

Answers:


13

因为echo连接了所有它的参数以打印它们,所以脚本仅限于第一个参数。您应该在脚本中使用"$@"而不是$1

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

  • ./test "A B"
    • 一个参数,即3个字符串 AspaceB
  • ./test ""A B""
    • 两个论点
      • 首先,empty stringA
      • 第二,Bempty string
  • ./test """A B"""
    • 一个参数,empty stringAspaceB串联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

那些是整齐的空字符串小东西。
mikeserv

2
确切地讲,引号不会嵌套……
spuratic先生
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.