我目前有一个 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
在其循环结构中用作关键字。要调用它,您必须指定命令的路径,例如./do
or $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"