我目前有一个 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 的东西?
我目前有一个 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 的东西?
您还必须使用引号中的第二个参数调用您的脚本
./scriptname sendcommand "command with spaces"
您的脚本应如下所示
#!/bin/bash
case "$1" in
sendcommand)
something "$2"
exit
;;
esac
用双引号括起来:
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从参数列表中删除并将剩余的(单个)参数重新编号为$1。othercommand然后它使用一个字符串参数调用,该字符串参数由串联在一起的参数内容组成。如果有多个参数,则内容将由一个“空格”(的第一个字符$IFS)分隔。
假设调用没有将参数括在引号中。该shift命令仍然从参数列表中删除$1( sendcommand),然后用空格将剩余的参数分隔为单个参数。
在所有这三种情况下,都othercommand看到了一个由以下组成的参数"this command with spaces"(当然,程序看不到双引号)。
您可以只使用双引号:
do X with "$2"