【问题标题】:Pass parameters that contain whitespaces via shell variable通过 shell 变量传递包含空格的参数
【发布时间】:2016-03-21 10:50:06
【问题描述】:

我有一个程序,我想通过从 shell 变量传递参数来调用它。在整个这个问题中,我将假设它是由

#!/bin/sh
echo $#

即它打印出传递给它的参数的数量。我们就叫它count-args吧。

我这样称呼我的程序:

X="arg1 arg2"
count-args $X

这很好用。但是现在我的一个论点中有一个空格,我找不到逃避它的方法,例如以下事情不起作用:

X="Hello\ World"
X="Hello\\ World"
X="'Hello World'"

在所有情况下,我的程序count-args 都会打印出2。我想找到一种方法,这样我就可以传递字符串Hello World,然后它返回1。怎么样?

只是为了澄清:我不想将所有参数作为单个字符串传递,例如

X="Hello World"
count-args $X

应该打印出2。我想要一种方法来传递包含空格的参数。

【问题讨论】:

  • 你自相矛盾。 X="Hello World"; count-args $X 应该打印出 1。要实现这一点,请使用 user1934428 所示的引号:"$X"。如果您希望将此单个字符串解释为多个参数,那么您做错了:mywiki.wooledge.org/BashFAQ/050!
  • @dekkard:因为我找到了一种完全符合我要求的方法,所以我非常有信心我的要求是一致的。但是感谢该链接,它非常有帮助。

标签: bash shell parameter-passing sh


【解决方案1】:

使用数组存储多个包含空格的参数。

$ args=("first one" "second one")
$ count-args "${args[@]}"
2

【讨论】:

    【解决方案2】:
     count-args "$X"
    

    在 bash 中,引号确保变量 X 的全部内容作为单个参数传递。

    【讨论】:

    • 值得注意的是,这不需要对X 进行任何特殊处理:X="Hello World"X 设置为包含空格的字符串,而@987654325 @ 用一个参数调用函数。您还需要在函数内部引用 $1 的扩展来保留空格。
    • 我认为这不是我想要的。我不想将所有参数作为单个字符串传递。我想要一种方法来传递包含空格的参数。在我的问题中添加了一段。我希望现在更清楚了。
    【解决方案3】:

    这可以通过xargs 解决。通过替换

    count-args $X
    

    echo $X | xargs count-args
    

    我可以使用反斜杠来转义 $X 中的空格,例如

    X="Hello\\ World"
    echo $X | xargs count-args
    

    打印出 1 和

    X="Hello World"
    echo $X | xargs count-args
    

    打印出 2.

    【讨论】:

      【解决方案4】:

      您的计数脚本:

      $ cat ./params.sh
      #!/bin/sh
      echo $#
      

      为了完整起见,这里是各种参数的情况:

      $ ./params.sh
      0
      $ ./params.sh  1 2
      2
      $ ./params.sh
      0
      $ ./params.sh 1
      1
      $ ./params.sh 1 2
      2
      $ ./params.sh "1 2"
      1
      

      这就是你得到的变量:

      $ XYZ="1 2" sh -c './params.sh $XYZ'
      2
      $ XYZ="1 2" sh -c './params.sh "$XYZ"'
      1
      

      更进一步:

      $ cat params-printer.sh
      #!/bin/sh
      echo "Count: $#"
      echo "1 : '$1'"
      echo "2 : '$2'"
      

      我们得到:

      $ XYZ="1 2" sh -c './params-printer.sh "$XYZ"'
      Count: 1
      1 : '1 2'
      2 : ''
      

      这看起来像你想做的。

      现在:如果您有一个无法控制的脚本,也无法控制调用该脚本的方式。然后,您几乎无法防止带有空格的变量变成多个参数。

      在 StackOverflow 上有很多关于此的问题,这表明您需要能够控制命令的调用方式,否则您无能为力。

      Passing arguments with spaces between (bash) script

      Passing a string with spaces as a function argument in bash

      Passing arguments to a command in Bash script with spaces

      哇!这个已经被问过很多次了:

      How to pass argument with spaces to a shell script function

      【讨论】:

        猜你喜欢
        • 2014-12-25
        • 1970-01-01
        • 1970-01-01
        • 2013-01-15
        • 1970-01-01
        • 2017-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多