我目前有一个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?
答案 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
命令仍然从参数列表中删除$1
(sendcommand
),然后空格将剩余的参数分隔为单个参数。
在所有三种情况下,othercommand
都会看到一个由"this command with spaces"
组成的参数(当然程序看不到双引号)。
答案 2 :(得分:2)
您可以使用双引号:
do X with "$2"