1

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

#!/bin/bash

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

我如何将所有命令发送this command with spaces到 $2 而不command充当 $3、with$4 等等?bash 是否有类似 PHP 或 Javascript 的 encodeURI 的东西?

4

3 回答 3

6

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

./scriptname sendcommand "command with spaces"

您的脚本应如下所示

#!/bin/bash

case "$1" in
    sendcommand)
        something "$2"
        exit
        ;;
esac
于 2012-07-03T20:42:04.843 回答
2

用双引号括起来:

do_X_with "$2"

双引号保留变量的内部间距,包括换行符(如果它们首先在值中)。事实上,理解双引号和"$@"and的用法也很重要"$*",更不用说在使用bash数组时了。

您不能轻易调用命令,do因为 shelldo在其循环结构中用作关键字。要调用它,您必须指定命令的路径,例如./door $HOME/bin/do


但是 $2 是“this”,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从参数列表中删除并将剩余的(单个)参数重新编号为$1othercommand然后它使用一个字符串参数调用,该字符串参数由串联在一起的参数内容组成。如果有多个参数,则内容将由一个“空格”(的第一个字符$IFS)分隔。

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

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

于 2012-07-03T20:00:16.980 回答
2

您可以只使用双引号:

do X with "$2"
于 2012-07-03T20:00:39.797 回答