Bash:将变量传递给具有空格的脚本

时间:2012-07-03 19:58:47

标签: bash

我目前有一个bash脚本。它看起来像这样:

#!/bin/bash

case "$1" in
    sendcommand)
        do X with $2
        exit
        ;;
esac

我如何将this command with spaces的所有命令发送到$ 2,而command不是3美元,with是$ 4,依此类推?是否有类似PHP或Javascript的encodeURI for bash?

3 个答案:

答案 0 :(得分:6)

您还必须使用引号中的第二个参数调用脚本

./scriptname sendcommand "command with spaces"

您的脚本应如下所示

#!/bin/bash

case "$1" in
    sendcommand)
        something "$2"
        exit
        ;;
esac

答案 1 :(得分:2)

用双引号括起来:

do_X_with "$2"

双引号保留变量的内部空间,包括换行符(如果它们位于第一位的值)。实际上,了解使用"$@""$*"的双引号也很重要,更不用说使用bash数组了。

您无法轻松拥有一个名为do的命令,因为shell在其循环结构中使用do作为关键字。要调用它,您必须指定命令的路径,例如./do$HOME/bin/do


  

但$ 2是“这个”,OP希望它是“带有空格的命令”。

行。我们需要检查命令行调用和所需的行为。我们假设正在执行的脚本被称为script。此外,正在执行的命令是othercommand(不能使用command;这是标准命令。)

可能的调用包括:

  • script sendcommand "this command with spaces"
  • script sendcommand 'this command with spaces'
  • script sendcommand this command with spaces

单引号和双引号调用在此示例中是等效的。如果要扩展变量或在参数列表中调用命令,它们将不相等。

可以编写script来处理所有三种情况:

#!/bin/bash

case "$1" in
    sendcommand)
        shift
        othercommand "$*"
        exit
        ;;
esac

假设调用用引号括起参数。 shift命令从参数列表中删除$1,并将剩余的(单个)参数重新编号为$1。然后它使用单个字符串参数调用othercommand,该参数由连接在一起的参数的内容组成。如果有多个参数,则内容将由单个“空格”($IFS的第一个字符)分隔。

假设调用不将参数括在引号中。 shift命令仍然从参数列表中删除$1sendcommand),然后空格将剩余的参数分隔为单个参数。

在所有三种情况下,othercommand都会看到一个由"this command with spaces"组成的参数(当然程序看不到双引号)。

答案 2 :(得分:2)

您可以使用双引号:

do X with "$2"